標籤:style blog http color io os ar for strong
接上述案例,案例改進:【iOS開發-50】利用建立新的類實現代碼封裝,從而不知不覺實踐一個簡單的MVC實驗,附帶個動畫
在上述案例中,我們最後實現了一個動畫,點擊“下載”按鈕變成“已下載”不可點擊,然後中間出現提示框。
(1)其中有一個小BUG,就是這個提示的透明度變成0之後,這個提示框並沒有顯示還留在記憶體中。需要:
[tipsLabel removeFromSuperview];
(2)其次,我們可以用另一個代碼實現動畫,就是用block,這一次是2個block嵌套。用如下代碼實現提示框漸層,並且消失移除:
[UIView animateWithDuration:2.5 animations:^{ tipsLabel.alpha=1; } completion:^(BOOL finished) { [UIView animateWithDuration:2.5 animations:^{ tipsLabel.alpha=0; } completion:^(BOOL finished) { [tipsLabel removeFromSuperview]; }]; }];
(3)還有一個失誤就是:
[self.superview.superview addSubview:tipsLabel];
這裡面其實是:
[self.superview addSubview:tipsLabel];
因為,我們的self相當於xib的小圖,它載入在ViewController的視圖裡,所以它的superview就是視圖控制器的視圖。至於為什麼多了一個superview沒有報錯還正常運作,可想答案,是因為上面已無superview所以沒有影響。
(4)增強改進:把提示框變成圓角矩形,用到圖層layer。
——首先,需要拿到一個控制項的圖層進行形狀設定。
——然後,需要瞭解的是,這個圖層一般稱之為主圖層,我們一般不直接在它的上面寫東西,而是把其他子圖層載入上去,但是這些子圖層一般是按照自己的想法顯示。這個時候我們的主圖層改變後,需要告訴它所有的子圖層,要遵守主圖層的邊界規則,也就是我主圖層什麼樣子什麼邊界你們就要什麼樣子。
——第二句和第三句的意思是一樣的,只不過一個是對控制項的圖層的屬性進行設定,一個對控制項的屬性進行設定。
tipsLabel.layer.cornerRadius=15;// tipsLabel.layer.masksToBounds=YES; tipsLabel.clipsToBounds=YES;
(5)增強改進:如下代碼是通過父子關係找到了視圖控制器的視圖,然後往裡面添加控制項,這種父子關係的尋找很危險,比如哪一天這種父子關係破壞了,則需要修改代碼。
[self.superview addSubview:tipsLabel];
我們可以把視圖控制器的視圖傳遞給一個參數,讓這個參數來執行。
比如在xibView.h中:
@property (strong,nonatomic) UIView *vcView;
然後在ViewController.m中:(把視圖控制器的視圖傳遞給這個參數)
xibView.vcView=self.view;
然後,在xibView.m中:
[self.vcView addSubview:tipsLabel];
這裡的self.vcView就是視圖控制器的視圖。
缺點:這種方法中,這個視圖不是很獨立,和這個視圖控制器耦合度太強,當這個視圖控制器不存在時,這個vcView視圖也就沒法起作用。
再改進:用代理。即這個類自己設定個協議(方法),把視圖控制器設定成代理,這樣當點擊按鈕的時候,就通知視圖控制器添加這個label。
——在XibView.h中設定協議和代理屬性:
#import <UIKit/UIKit.h>#import "JiuGongGe.h"@class XibView;//需要匯入自己這個類?//定義一個協議@protocol JGXibViewDelegate <NSObject>@optional-(void)xibViewClickBtn:(XibView *)xibView;@end@interface XibView : UIView//定義一個代理屬性@property(weak,nonatomic)id<JGXibView@end
——在XibView.m中:
如果代理有這個方法,那麼就發送訊息給代理(即調用這個方法)
- (IBAction)installClick:(UIButton *)btn { //改變按鈕文字已經設定為disable [btn setTitle:@"已安裝" forState:UIControlStateDisabled]; btn.enabled=NO; if ([self.delegate respondsToSelector:@selector(xibViewClickBtn:)]) { [self.delegate xibViewClickBtn:self]; }}
——在代理中(因為添加label是在視圖控制器的視圖中添加的,所以這些代碼應該在視圖控制器中,所以把視圖控制器設定為代理,具體執行添加操作):
先遵守協議
@interface ViewController ()<JGXibViewDelegate>
在viewDidLoad中設定代理
xibView.delegate=self;
最後實現方法
-(void)xibViewClickBtn:(XibView *)xibView{ //調用方法建立UILabel UILabel *tipsLabel=[XibView tipsView]; //設定UILabel顯示位置 CGFloat tipW=250; CGFloat tipH=30; tipsLabel.frame=CGRectMake((self.view.frame.size.width-tipW)/2, self.view.frame.size.height/2, tipW, tipH); //設定UILabel文字和背景樣式 JiuGongGe *jiugongge=xibView.jiuGongGe;//這裡是關鍵,把被點擊的這個小視圖的模型拿出來 tipsLabel.text=[NSString stringWithFormat:@"%@ 已經安裝成功!",jiugongge.name];//取出這個模型的name資料 tipsLabel.textColor=[UIColor whiteColor]; tipsLabel.backgroundColor=[UIColor grayColor]; tipsLabel.font=[UIFont systemFontOfSize:14]; tipsLabel.layer.cornerRadius=15; // tipsLabel.layer.masksToBounds=YES; tipsLabel.clipsToBounds=YES; //設定顯示時候的動畫,透明和不透明的變化 [UIView animateWithDuration:2.5 animations:^{ tipsLabel.alpha=1; } completion:^(BOOL finished) { [UIView animateWithDuration:2.5 animations:^{ tipsLabel.alpha=0; } completion:^(BOOL finished) { [tipsLabel removeFromSuperview]; }]; }]; [self.view addSubview:tipsLabel];}
【iOS開發-57】案例改進:block動畫、控制項的removeFromSuperview、利用layer設定圓角矩形以及代理模式運用