【iOS開發-57】案例改進:block動畫、控制項的removeFromSuperview、利用layer設定圓角矩形以及代理模式運用

來源:互聯網
上載者:User

標籤: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設定圓角矩形以及代理模式運用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.