基礎(chǔ) (十一) : 自定義View

掌握

UIView的常見屬性和方法

九宮格計(jì)算方法

字典轉(zhuǎn)模型

Xib的使用

自定義view(view的封裝)

簡單的MVC

搭建九宮格的步驟

明確每一塊用的是什么view

明確每個(gè)view之間的父子關(guān)系

先嘗試逐個(gè)逐個(gè)添加格子燥透,最后考慮使用for循環(huán)

加載app數(shù)據(jù)麦射,根據(jù)數(shù)據(jù)長度創(chuàng)建對應(yīng)個(gè)數(shù)的格子

添加格子內(nèi)部的子控件

給格子內(nèi)部的子控件裝配數(shù)據(jù)

未命名圖片.png
未命名圖片1.png

用模型取代字典的好處

使用字典的壞處

一般情況下,設(shè)置數(shù)據(jù)和取出數(shù)據(jù)都使用“字符串類型的key”,編寫這些key時(shí)寄症,編輯器沒有智能提示彻秆,需要手敲

dict[@"name"] = @"Jack";

NSString *name = dict[@"name"];

手敲字符串key,key容易寫錯(cuò)

Key如果寫錯(cuò)了能扒,編譯器不會有任何警告和報(bào)錯(cuò)块茁,造成設(shè)錯(cuò)數(shù)據(jù)或者取錯(cuò)數(shù)據(jù)

使用模型的好處

所謂模型齿坷,其實(shí)就是數(shù)據(jù)模型桂肌,專門用來存放數(shù)據(jù)的對象,用它來表示數(shù)據(jù)會更加專業(yè)

模型設(shè)置數(shù)據(jù)和取出數(shù)據(jù)都是通過它的屬性永淌,屬性名如果寫錯(cuò)了崎场,編譯器會馬上報(bào)錯(cuò),因此遂蛀,保證了數(shù)據(jù)的正確性

使用模型訪問屬性時(shí)谭跨,編譯器會提供一系列的提示,提高編碼效率

app.name = @"Jack";

NSString *name = app.name;

字典轉(zhuǎn)模型

字典轉(zhuǎn)模型的過程最好封裝在模型內(nèi)部

模型應(yīng)該提供一個(gè)可以傳入字典參數(shù)的構(gòu)造方法

-(instancetype)initWithDict:(NSDictionary *)dict;

  • (instancetype)xxxWithDict:(NSDictionary
    *)dict;

Instancetype

instancetype在類型表示上李滴,跟id一樣螃宙,可以表示任何對象類型

instancetype只能用在返回值類型上,不能像id一樣用在參數(shù)類型上

instancetype比id多一個(gè)好處:編譯器會檢測instancetype的真實(shí)類型

未命名圖片2.png
未命名圖片3.png
未命名圖片4.png

注意點(diǎn)

一個(gè)控件有2種創(chuàng)建方式

通過代碼創(chuàng)建

初始化時(shí)一定會調(diào)用initWithFrame:方法

通過xib\storyboard創(chuàng)建

初始化時(shí)不會調(diào)用initWithFrame:方法悬嗓,只會調(diào)用initWithCoder:方法

初始化完畢后會調(diào)用awakeFromNib方法

有時(shí)候希望在控件初始化時(shí)做一些初始化操作污呼,比如添加子控件、設(shè)置基本屬性

這時(shí)需要根據(jù)控件的創(chuàng)建方式包竹,來選擇在initWithFrame:(給控件設(shè)置位置)、initWithCoder:籍凝、awakeFromNib(初始化控件)的哪個(gè)方法中操作

未命名圖片5.png

Xib和storyboard對比

共同點(diǎn):

都用來描述軟件界面

都用Interface
Builder工具來編輯

不同點(diǎn)

Xib是輕量級的周瞎,用來描述局部的UI界面

Storyboard是重量級的,用來描述整個(gè)軟件的多個(gè)界面饵蒂,并且能展示多個(gè)界面之間的跳轉(zhuǎn)關(guān)系

view的封裝

如果一個(gè)view內(nèi)部的子控件比較多声诸,一般會考慮自定義一個(gè)view,把它內(nèi)部子控件的創(chuàng)建屏蔽起來退盯,不讓外界關(guān)心

外界可以傳入對應(yīng)的模型數(shù)據(jù)給view彼乌,view拿到模型數(shù)據(jù)后給內(nèi)部的子控件設(shè)置對應(yīng)的數(shù)據(jù)

UILabel的常見設(shè)置

@property(nonatomic,copy) NSString *text; // 顯示的文字

@property(nonatomic,retain) UIFont *font; // 字體

@property(nonatomic,retain) UIColor *textColor; // 文字顏色

@property(nonatomic) NSTextAlignment textAlignment; // 對齊模式(比如左對齊、居中對齊渊迁、右對齊)

UIFont

UIFont代表字體慰照,常見創(chuàng)建方法有以下幾個(gè):

  • (UIFont*)systemFontOfSize:(CGFloat)fontSize; // 系統(tǒng)默認(rèn)字體

  • (UIFont*)boldSystemFontOfSize:(CGFloat)fontSize; // 粗體

  • (UIFont *)italicSystemFontOfSize:(CGFloat)fontSize; // 斜體

UIButton的常見設(shè)置

-(void)setTitle:(NSString *)title forState:(UIControlState)state; // 設(shè)置按鈕的文字
-(void)setTitleColor:(UIColor *)color forState:(UIControlState)state; // 設(shè)置按鈕的文字顏色
-(void)setImage:(UIImage *)image forState:(UIControlState)state; // 設(shè)置按鈕內(nèi)部的小圖片

-(void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state; // 設(shè)置按鈕的背景圖片

// 設(shè)置按鈕的文字字體(需要拿到按鈕內(nèi)部的label來設(shè)置)

btn.titleLabel.font= [UIFont systemFontOfSize:13];

-(NSString *)titleForState:(UIControlState)state; // 獲得按鈕的文字

-(UIColor *)titleColorForState:(UIControlState)state; // 獲得按鈕的文字顏色

-(UIImage *)imageForState:(UIControlState)state; // 獲得按鈕內(nèi)部的小圖片

-(UIImage *)backgroundImageForState:(UIControlState)state; //獲得按鈕的背景圖片

獲取plist的全路徑方法:

當(dāng)NSString*path = [[NSBundle mainBundle]
pathForrResource:@"shop" ofType:@"plist"];

當(dāng)解析Plist文件

接下來通過代碼來解析Plist文件中的數(shù)據(jù)

獲得Plist文件的全路徑NSBundle *bundle = [NSBundle mainBundle];

NSString *path = [bundle pathForResource:@"shops" ofType:@"plist"];

未命名圖片6.png
Untitled picture.png

用代碼的方式去自定義控件的注意點(diǎn):

Plist的使用注意:

  1. Plist的文件名不能叫做"info"/"Info"之類(會出現(xiàn)不可預(yù)計(jì)的錯(cuò)誤)

2.添加plist等文件資源的時(shí)候,一定要勾選下面的選項(xiàng)(黏貼等選項(xiàng))

1.layoutSubvies 布局內(nèi)部的自控件(子控件frame發(fā)生變化的時(shí)候才會調(diào)用)

一定要調(diào)用[superlayouSubvies]記住了是一定會調(diào)用這個(gè)方法

只要當(dāng)前的view的frame發(fā)生改變就會調(diào)用這個(gè)方法

view一初始化完也會調(diào)用這個(gè)方法,嘗試著給自己的子控件賦值

步驟1. 初始化自定義的view (只是調(diào)用init方法)

2. 設(shè)置frame

3. 在init方法中給子控件設(shè)置frame, 但是self的frame是沒有值的

4. 只要是自定義的控件,那么必須得在layoutSubvies中賦值

2.initWithFrame的使用(介意以后自定義控件的時(shí)候去實(shí)現(xiàn)initWithFrame的方法)盡量別使用init方法

在initWithFrame方法中初始化子控件(不管外界是使用init 還是initWithFrame 都會調(diào)用initWithFrame 方法)

未命名圖片7.png

property的使用策略

strong 一般是使用在OC對象上(也可以使用在UI控件上(會有問題的))

NSSArray  NSDictionary 模型...

weak  一般是使用在UI控件上  也可以使用在OC對象(也是有問題的)
  UITextFeild UIButton.....

copy   一般使用在NSString  Block

assign  一般是使用基本數(shù)據(jù)類型上, 枚舉  結(jié)構(gòu)體

思路

1. 創(chuàng)建一個(gè)類  自定義的控件什么樣的控件(就直接繼承什么樣的類)

     自定義一個(gè)按鈕   那么繼承自UIButton

2. 在initWithFrame 中初始化子控件做一次性的操作

3. layoutSubvies 中設(shè)置子控件的frame

4. 暴露一個(gè)模型屬性給外界傳值(傳值的方法有很多  想到什么就使用什么方式)

重寫init方法的使用和注意

一定要調(diào)用super的init方法:因?yàn)槌跏蓟割愔袝暶饕恍┏蓡T變量和其他屬性
就是調(diào)用super的init方法 最后返回的就是一個(gè)id也就是self

有時(shí)候調(diào)用[super init]方法返回的不一定是一個(gè)self,但是為了保證它返回的是一個(gè)self就要進(jìn)行一個(gè)賦值操作;

注意:調(diào)用super初始化完畢 就一定要賦值給self

返回一個(gè)self意思是:返回一個(gè)已經(jīng)初始化完畢的一個(gè)對象

構(gòu)造方法的注意點(diǎn):

先調(diào)用父類的構(gòu)造方法[super init];

再進(jìn)行子類內(nèi)部成員變量的初始化

未命名圖片8.png

*********************筆記***********************


  1. plist root : 選擇的類型是神馬(NSArray)樣的 返回的就是神馬(NSArray)(需要使用神馬(NSArray)接收)
    步驟1. 獲取plist文件的全路徑
    2. 根據(jù)路徑加載plist中所有數(shù)據(jù)

  2. 模型:(就是把字典里面的數(shù)據(jù)通過創(chuàng)建類來轉(zhuǎn)化成模型,便于自己使用)

    1. 使用一個(gè)臨時(shí)數(shù)組裝從plist 中加載的數(shù)組(裝的都是字典)
    2. 遍歷臨時(shí)數(shù)組, 取出每一個(gè)字典
    3. 將字典賦值給模型
    4. 將模型存放到數(shù)組(可變數(shù)組)中
  3. plist 用來存儲一些經(jīng)常變動的數(shù)據(jù),或者多處需要使用的
    模型 將字典轉(zhuǎn)換成可讀性比較高的代碼
    而且不容易出錯(cuò)

  4. 類前綴
    ios
    ns(next step)string

    ShopModel
    ShopModel

    包 java
    com.biz.xj.ShopModel

  1. instancetype && id

    1. id 任意對象 可以使用任何對象接收 沒有任何警告和提示
    2. instancetype 會檢測你的真實(shí)返回類型 , 那么如果類型不匹配直接警告
  2. layoutSubvies 布局內(nèi)部的自控件
    只要當(dāng)前的view的frame發(fā)生改變就會調(diào)用這個(gè)方法(只要一改變子控件的位置,它就會自動調(diào)用這個(gè)方法)
    view一初始化完也會調(diào)用這個(gè)方法,嘗試著給自己的子控件賦值

    步驟1. 初始化自定義的view (只是調(diào)用init方法)
    2. 設(shè)置frame
    3. 在init方法中給子控件設(shè)置frame, 但是self的frame是沒有值的
    4. 只要是自定義的控件,那么必須得在layoutSubvies中賦值

  3. 注意:(最好使用initWithFrame系統(tǒng)提供的這個(gè)方法)(initWithFrame方法中初始化子控件(不管外界是使用init 還是initWithFrame 都會調(diào)用initWithFrame方法))

  1. property的使用策略

    strong 一般是使用在OC對象上 (也可以使用在UI控件上(會有問題的))
    NSSArray NSDictionary 模型...
    weak 一般是使用在UI控件上 也可以使用在OC對象(也是有問題的)
    UITextFeild UIButton.....
    copy 一般使用在NSString Block
    assign 一般是使用基本數(shù)據(jù)類型上, 枚舉 結(jié)構(gòu)體

  2. 自定義控件設(shè)置數(shù)據(jù)

    1. tag 給自己的子控件添加一個(gè)tag,在控制器立獲取tag對應(yīng)的子控件賦值
    2. 使用方法
    3. 使用屬性
    4. 控件暴露在.h文件
    5. 使用模型屬性
    6. Block (不做沒關(guān)系)
    7. 代理
  1. 思路
    1. 創(chuàng)建一個(gè)類 自定義的控件什么樣的控件(就直接繼承什么樣的類)
      自定義一個(gè)按鈕 那么繼承自UIButton
    2. 在initWithFrame 中初始化子控件 做一次性的操作
    3. layoutSubvies 中設(shè)置子控件的frame
    4. 暴露一個(gè)模型屬性給外界傳值(傳值的方法有很多 想到什么就使用什么方式)

*********************總結(jié)***********************
*********************NO4***********************

  1. plist root : 選擇的類型是神馬(NSArray)樣的 返回的就是神馬(NSArray)(需要使用神馬(NSArray)接收)
    步驟1. 獲取plist文件的全路徑
    2. 根據(jù)路徑加載plist中所有數(shù)據(jù)

  2. 模型:

    1. 使用一個(gè)臨時(shí)數(shù)組裝從plist 中加載的數(shù)組(裝的都是字典)
    2. 遍歷臨時(shí)數(shù)組, 取出每一個(gè)字典
    3. 將字典賦值給模型
    4. 將模型存放到數(shù)組(可變數(shù)組)中
  3. plist 用來存儲一些經(jīng)常變動的數(shù)據(jù),或者多處需要使用的
    模型 將字典轉(zhuǎn)換成可讀性比較高的代碼
    而且不容易出錯(cuò)

  4. 類前綴
    ios
    ns(next step)string

    ShopModel
    ShopModel

    包 java
    com.biz.xj.ShopModel

  1. instancetype && id

    1. id 任意對象 可以使用任何對象接收 沒有任何警告和提示
    2. instancetype 會檢測你的真實(shí)返回類型 , 那么如果類型不匹配直接警告
  2. layoutSubvies 布局內(nèi)部的自控件
    只要當(dāng)前的view的frame發(fā)生改變就會調(diào)用這個(gè)方法
    view一初始化完也會調(diào)用這個(gè)方法,嘗試著給自己的子控件賦值

    步驟1. 初始化自定義的view (只是調(diào)用init方法)
    2. 設(shè)置frame
    3. 在init方法中給子控件設(shè)置frame, 但是self的frame是沒有值的
    4. 只要是自定義的控件,那么必須得在layoutSubvies中賦值

  3. 在initWithFrame方法中初始化子控件(不管外界是使用init 還是initWithFrame 都會調(diào)用initWithFrame 方法)
    在layoutSubvies 中給子控件設(shè)置frame

  1. property的使用策略

    strong 一般是使用在OC對象上 (也可以使用在UI控件上(會有問題的))
    NSSArray NSDictionary 模型...
    weak 一般是使用在UI控件上 也可以使用在OC對象(也是有問題的)
    UITextFeild UIButton.....
    copy 一般使用在NSString Block
    assign 一般是使用基本數(shù)據(jù)類型上, 枚舉 結(jié)構(gòu)體

  2. 自定義控件設(shè)置數(shù)據(jù)

    1. tag 給自己的子控件添加一個(gè)tag
      在控制器立獲取tag對應(yīng)的子控件賦值
    2. 使用方法
    3. 使用屬性
    4. 控件暴露在.h文件
    5. 使用模型屬性
    6. Block (不做沒關(guān)系)
    7. 代理
  1. 思路
    1. 創(chuàng)建一個(gè)類 自定義的控件什么樣的控件(就直接繼承什么樣的類)
      自定義一個(gè)按鈕 那么繼承自UIButton
    2. 在initWithFrame 中初始化子控件 做一次性的操作
    3. layoutSubvies 中設(shè)置子控件的frame
    4. 暴露一個(gè)模型屬性給外界傳值(傳值的方法有很多 想到什么就使用什么方式)

*********************總結(jié)***********************
*********************NO4***********************

  1. 總結(jié)
    plist: 創(chuàng)建方式
    加載 mianbundle中查找路徑
    根據(jù) root 接收一個(gè)數(shù)組或者字典類型
    NSArray(NSDictionary) array(dictionary)WithContentOfFile:

    懶加載
    1. 用到的時(shí)候再加載
    2. 一般是寫在get方法中
    3. 只要你去使用,那么肯定是調(diào)用get方法

    layoutSubviews
    1. 一般都是設(shè)置子控件的frame
    2. 只要父控件的frame發(fā)生改變就會調(diào)用
    3. 在initWithFrame之后也會默認(rèn)調(diào)用一次這個(gè)方法(嘗試著給子控件賦值)

    封裝view
    1. 在initWithFrame中初始化子控件,并且做一次性操作
    2. 在layoutSubviews 中給子控件frame賦值
    3. 提供一個(gè)模型屬性供外界賦值
    4. 在模型屬性的set方法中給子控件賦值(參數(shù))

    封裝的好處
    1. 任意在任何項(xiàng)目中使用
    2. 改變數(shù)據(jù)不會影響控制器
    3. 改變內(nèi)部的空間也不會影響到控制器

  2. MVC
    m model 模型 數(shù)據(jù)層
    v view 視圖(自定義控件)表示層
    c controller 管理層(控制器)

    1. 控制器創(chuàng)建視圖(view)
    2. 控制器創(chuàng)建模型 (控制器要顯示什么樣的數(shù)據(jù)應(yīng)該是控制器決定)
    3. 控制器負(fù)責(zé)將模型數(shù)據(jù)賦值給視圖

// ------------------------以上是代碼封裝-------------------------

  1. xib
    創(chuàng)建 new file - > 選擇user interface - > view (empty)
    加載 使用mainbundle加載
    nsbundle mainbundle]loadNibName:(xib名字) nil nil
    [UINib nibWithName:xib名字 nil nil]
    nib對象 instantiateWithOwner nil nil
    mianbundle 如果mainbundle 只有是參數(shù) 那么就可以直接傳nil

  2. 自定義控件

    1. 創(chuàng)建一個(gè)xib
    2. 往xib中添加子控件
    3. 修改xib的類型
    4. 提供一個(gè)類方法
      在類方法中直接返回從mainbundle中加載的控件數(shù)組,拿到最后一個(gè)
      xib 一個(gè)xib數(shù)組中一般情況下只有一個(gè)控件
      直接返回
    5. 提供一個(gè)模型屬性
      在set方法中給子控件賦值
  1. 在通過nib 加載view的話 那么只會調(diào)用 initWithCoder awakeFromNib
    通過代碼的方法我們必須使用initWithFrame那么就會調(diào)用 init/ initWithFrame
    其實(shí)很重要的
    只要是生命周期方法 都是很重要
    1. init 初始化子控件,做一些一次性的操作
    2. initWithFrame 初始化子控件,做一次性操作. 調(diào)用了init也會調(diào)用這個(gè)方法
      一般情況使用代碼自定義控件那么必須得這里初始化子控件
    3. initWithCoder 在子控件加載完畢之前可以做的操作,
      比如 在子控件加載玩之前,需要再添加一個(gè)控件
      不能給子控件賦值 因?yàn)樽涌丶]有值(空的)
    4. awakeFromNib 子控件加載完畢之后需要做的操作
      比如, 給子控件賦值,設(shè)置frame

http://www.easyicon.net/iconsearch 圖標(biāo)大全

***************************NO5******************************
***************************NO5******************************

  1. hud
    江湖人稱為: 蒙版/遮蓋/hud
    UIAlertView
    UIAlertView *alert = [UIAlertView alloc]initWithTitle:<#(NSString *)#> message:<#(NSString *)#> delegate:<#(id)#> cancelButtonTitle:<#(NSString *)#> otherButtonTitles:<#(NSString *), ...#>, nil;

     [alert show];
    
    1. hidden 隱藏控件 YES 隱藏 NO 不隱藏(是否顯示或者不顯示)

    2. alpha 0.0完全透明 1.0 沒有透明度(別搞反了,0.0是完全透明)

    3. 漸變動畫
      幀動畫 一幀一幀的播放動畫(一張一張圖片的切換)
      漸變動畫 (alpha 0.0 ~ 1.0) hidden (yes NO)
      frame x y width height
      0
      1
      2
      ...
      10
      20
      ...
      180
      190
      1). 頭尾式
      開始動畫
      [UIView beginAnimations:nil context:nil];
      動畫時(shí)間
      [UIView setAnimationDuration:2.0f];
      self.hudLabel.alpha = 1.0;
      self.hudLabel.text = @"感覺滿滿的";
      提交動畫
      [UIView commitAnimations];

       2). block 式
           [UIView animateWithDuration:2.0f animations:^{
               需要執(zhí)行的代碼
               self.hudLabel.alpha = 1.0;
               self.hudLabel.text = @"感覺滿滿的";
               延遲 4 s 調(diào)用  self  的 hideHud方法
               [self performSelector:@selector(hideHud) withObject:nil afterDelay:4.0];
           }];
      
       3) block 式 "帶完成的block"
      
           [UIView animateWithDuration:2.0f animations:^{
                           需要執(zhí)行的代碼
                           self.hudLabel.alpha = 1.0;
                           self.hudLabel.text = @"感覺滿滿的";
                       } completion:^(BOOL finished) {
                           [UIView animateWithDuration:2.0f animations:^{
                               需要執(zhí)行的代碼
                               self.hudLabel.alpha = 0.0f;
                           }];
                       }];
       4). block 式  "帶完成的block  延遲的時(shí)間"
           [UIView animateWithDuration:1.0f animations:^{
               需要執(zhí)行的代碼
               self.hudLabel.alpha = 1.0f;
           } completion:^(BOOL finished) {
               延遲十秒 執(zhí)行動畫的代碼 執(zhí)行時(shí)間 是  2.0f
               [UIView animateWithDuration:1.0f delay:1.0f options:kNilOptions animations:^{
                   需要執(zhí)行的代碼
                   self.hudLabel.alpha = 0.0f;
               } completion:^(BOOL finished) {
                   
               }];
           }];
      
  2. 按鈕的內(nèi)部結(jié)構(gòu)
    圖片 和 標(biāo)題 間距
    self.titleEdgeInsets; 改變標(biāo)題在按鈕中的位置
    self.imageEdgeInsets 改變圖片在按鈕中的位置
    self.contentEdgeInsets 改變按鈕中所有內(nèi)容的位置
    設(shè)置內(nèi)間距
    圖片 和 標(biāo)題 位置布局
    直接影響按鈕內(nèi)部的子控件
    缺陷 不知道先調(diào)用的是哪個(gè)方法(不推薦使用)
    - (CGRect)titleRectForContentRect:(CGRect)contentRect
    {
    self.titleH = contentRect.size.height * 0.4;
    return CGRectMake(0, 0, contentRect.size.width,self.titleH);
    }

     - (CGRect)imageRectForContentRect:(CGRect)contentRect
     {
         return CGRectMake(0, contentRect.size.height * 0.4, contentRect.size.width, contentRect.size.height * 0.6);
     }
    
     一般情況下  都是使用layoutSubviews 布局子控件
         layoutSubviews  準(zhǔn)確性??高
    
  3. 圖片的拉伸的三種方式:
    http://blog.csdn.net/q199109106q/article/details/8615661

    "默認(rèn)是平鋪的方式"
    UIImage *resizeImg = [image resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)];

    "需要選擇拉伸或者平鋪的模式"
    UIImage *resizeImg = [image resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10) resizingMode:UIImageResizingModeTile];

    // 系統(tǒng)會根據(jù)你傳入的左邊的寬度 算出右邊的寬度
    // 1 = width - leftCapWidth - right
    // 系統(tǒng)會根據(jù)你傳入的頂部的高度算出底部的高度
    // 1 = height - topCapWidth - bottom
    // 拉伸的是1x1 的區(qū)域
    UIImage *resizeImg = [image stretchableImageWithLeftCapWidth:image.size.width * 0.5 topCapHeight:image.size.height *0.5];

  4. copy

    1. 深拷貝 對象拷貝 產(chǎn)生一個(gè)新對象
    2. 淺拷貝 指針拷貝 指向同一個(gè)地址
    3. strong / copy
      strong 兩個(gè)會跟著發(fā)生改變
      copy 拷貝一個(gè)副本,改變副本不會影響源文件, 改變源文件不會影響到副本
    4. property copy 在set方法中寫 _str = [str copy];
    5. 調(diào)用copy的時(shí)候, 返回的是一個(gè)不可變對象
    6. 調(diào)用mutableCopy 返回一個(gè)可變對象
  1. kvc key value coding
    1. 賦值
      setValue:forKey 只能給當(dāng)前對象的屬性賦值
      setValue: forKeyPath: 可以給當(dāng)前對象的屬性賦值 還能當(dāng)前對象的屬性的屬性賦值
      setValuesForKeysWithDictionary 傳第一個(gè)字典給自己的所有屬性賦值 必須屬性名字和字典中key一致
      forUndefinedKey 這個(gè)方法當(dāng)找不到這個(gè)某個(gè)key就會調(diào)用 系統(tǒng)自己調(diào)用

    2. 取值
      valueForKey 獲取當(dāng)前對象的屬性的值
      valueForKeyPath 獲取當(dāng)前對象的屬性的屬性的....值 也能獲取當(dāng)前對象的屬性的值

  1. kvo key value observer
    1. 添加監(jiān)聽者
      監(jiān)聽屬性值的改變
      self監(jiān)聽 p對象的 name這個(gè)屬性發(fā)生改變,
      只要這個(gè)屬性發(fā)生改變 系統(tǒng)調(diào)用下面的監(jiān)聽方法
      [p addObserver:self forKeyPath:@"sex" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@"他是傻逼"];

    2. 移除
      只要監(jiān)聽完之后就可以移除
      [p removeObserver:self forKeyPath:@"sex"];

    3. 重寫監(jiān)聽方法

      • (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
        {
        NSLog(@"keypath =%@,object = %@,change = %@,context = %@",keyPath,object,change,context);

          NSString *str = change[@"new"];
          if ([str isEqualToString:@"xiaojian"]) {
              NSLog(@"-=----%@",context);
          }
        

      }

執(zhí)行動畫 2秒以后執(zhí)行這里的代碼
[UIView animateWithDuration:2.0f animations:^{
     需要執(zhí)行動畫的代碼
    self.hud.alpha = 0.5f;
} completion:^(BOOL finished) {
     動畫執(zhí)行完畢的時(shí)候調(diào)用
     需要動畫結(jié)束操作的代碼
     animateWithDuration : 時(shí)間
     delay : 延遲
     options : 動畫的選項(xiàng)
     animations : 需要執(zhí)行的動畫代碼
     completion : 動畫完成
     延遲 2.0s 后執(zhí)行 隱藏hud的動畫,動畫執(zhí)行時(shí)間為1.0s

[UIView animateWithDuration:1.0f delay:2.0f options:kNilOptions animations:^{
self.hud.alpha = 0.0f;

    } completion:nil];

當(dāng)點(diǎn)擊self.view的時(shí)候就會調(diào)用

  • (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
    打印內(nèi)部的子控件
    NSLog(@"-----%@",self.myBtn.subviews);
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末琉朽,一起剝皮案震驚了整個(gè)濱河市毒租,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌箱叁,老刑警劉巖墅垮,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異耕漱,居然都是意外死亡算色,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門螟够,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灾梦,“玉大人,你說我怎么就攤上這事〕夥希” “怎么了椒楣?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長牡肉。 經(jīng)常有香客問我捧灰,道長,這世上最難降的妖魔是什么统锤? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任毛俏,我火速辦了婚禮,結(jié)果婚禮上饲窿,老公的妹妹穿的比我還像新娘煌寇。我一直安慰自己,他們只是感情好逾雄,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布阀溶。 她就那樣靜靜地躺著,像睡著了一般鸦泳。 火紅的嫁衣襯著肌膚如雪银锻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天做鹰,我揣著相機(jī)與錄音击纬,去河邊找鬼。 笑死钾麸,一個(gè)胖子當(dāng)著我的面吹牛更振,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饭尝,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼肯腕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了芋肠?” 一聲冷哼從身側(cè)響起乎芳,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎帖池,沒想到半個(gè)月后奈惑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡睡汹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年肴甸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囚巴。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡原在,死狀恐怖友扰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情庶柿,我是刑警寧澤村怪,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站浮庐,受9級特大地震影響甚负,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜审残,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一梭域、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧搅轿,春花似錦病涨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沸柔,卻和暖如春循衰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背褐澎。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伐蒋,地道東北人工三。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像先鱼,于是被迫代替她去往敵國和親俭正。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,125評論 29 470
  • 1.自定義控件 a.繼承某個(gè)控件 b.重寫initWithFrame方法可以設(shè)置一些它的屬性 c.在layouts...
    圍繞的城閱讀 3,349評論 2 4
  • 文章引自http://www.reibang.com/p/7e47da62899c焙畔,感謝作者貢獻(xiàn)的文章掸读。 1.使用...
    DDB_CS閱讀 4,270評論 1 4
  • 這兩天周末兒子晚上玩游戲比其他時(shí)間長,他的說法是好不容易到星期五星期六應(yīng)該久玩一點(diǎn)宏多,更嚴(yán)重的是兒子不知玩到什么時(shí)候...
    馮梅fm閱讀 145評論 0 2
  • 使用CSS制作條紋背景圖 prerequisitesCSS linear gradients,background...
    _陳慧敏閱讀 399評論 0 1