UI第三天:⾃定義視圖、視圖控制器

⼀、⾃定義視圖
自定義視圖步驟
     1.
創建了一個UIview
     2.
重寫新類的 初始化方法
     3.
把想添加的視圖 封裝到新類裏面(初始化到新類中)
     4.
爲了方便外部進行賦值取值把添加的視圖寫成屬性(別忘了deacllo釋放)
     5.
測試一下;
    
     自定義視圖的好處 : 提高工作效率 大大提高代碼的複用性
label-textField視圖
假設我們使⽤LTView類代表label-textfield視圖。
我們創建⼀個LTView類繼承於UIView。
我們將LTView作爲⼀個容器,在LTView的初始化⽅法中創建並添加 label和textField。
此時的LTView就變成了⼀個具有label和textField的視圖了。
// 重寫初始化方法 在初始化LTView的同時把label也加上去
-(
instancetype)initWithFrame:(CGRect)frame
{
   
self = [super initWithFrame:frame];
   
if(self)
    {
       
self.label = [[UILabel alloc]initWithFrame: CGRectMake(0, 0,self.frame.size.width/3, self.frame.size.height)];
       
self.label.backgroundColor = [UIColor clearColor];
       
self.label.textAlignment = NSTextAlignmentCenter;
        [
self addSubview:self.label];
        [
_label release];
       
self.text = [[UITextField alloc]initWithFrame:CGRectMake(self.frame.size.width/3+20, 0, self.frame.size.width/3*2-20, self.frame.size.height)];
       
self.text.borderStyle = UITextBorderStyleRoundedRect;
        [
self addSubview:self.text];
        [
_text release];
       
       
//獲取動態寬度與高度
     
//  CGFloat width = frame.size.width;
     
//  CGFloat height = frame.size.height;
    }
   
return self;
}
⾃定義LTView使⽤了⼀種設計模式:複合設計模式。
複合設計模式:A類中,使⽤B類(或者更多類)作爲⾃⼰的成員(實例 變量)。
iOS中複合是特別常⻅的設計模式。iOS新控件往往都是⽤已有控件組合 ⽽成的。

⼆、視圖控制器指定⾃定義View
視圖控制器概述
UIViewController:視圖控制器。
控制視圖顯⽰,響應事件。
分擔AppDelegate的⼯作。
實現模塊獨⽴,提⾼復⽤性。
視圖控制器功能
控制視圖⼤⼩變換、佈局視圖、響應事件。
檢測以及處理內存警告。
檢測以及處理屏幕旋轉。
檢測視圖的切換。
MVC概述
UIViewController是MVC設計模式的核⼼。
MVC是⼀個框架級的設計模式。
M是Model,主要⽤於建⽴數據模型(即數據的結構)
V是View,我們能看到的所有控件都是view,view主要的功能是展⽰數據。
C是控制器,主要是控制M和V的通信
  /*
     MVC
是一種設計模式
    
好處:讓視圖(view)可以複用
    
應用:
     1.
視圖層(view) 只寫視圖 的佈局
     2.
數據模型層(model)只寫數據的結構(只寫ns開頭的)
     3.
控制器(control)負責邏輯部分(例如從model中取數據然後區更改視圖顯示)
     MVC
把工程中的代碼模塊化 儘量讓視圖部分代碼複用降低耦合度
    
一般一個視圖控制器控制一個頁面
     */
使⽤視圖控制器
定義UIViewController的⼦類
創建視圖控制器對象,作爲window的根視圖控制器
在viewDidLoad中使⽤默認創建好的視圖對象view
    self.window.backgroundColor = [UIColor whiteColor];
    [
self.window makeKeyAndVisible];
   
// 顯示控制器自帶的view
   
// window設置一個根視圖控制器
   
// 初始化控制器
   
RootViewController *rootVC = [[RootViewController alloc]init];
   
// 設置根視圖控制器
    [
self.window setRootViewController:rootVC];
   
// 釋放
    [rootVC release];
爲什麼使⽤⾃定義視圖類
UIViewController⾃帶⼀個空的view,與需求不符合。
視圖控制器只負責控制視圖顯⽰,響應事件。
// 每一個視圖控制器都自帶一個view
// 並且這個view與屏幕一樣大小
//這個方法是加載視圖 並且加載的是自己自帶的view
如何設置
⾃定義視圖類繼承UIView。在初始化⽅法中添加⼦視圖控件。
重寫controller的loadView⽅法。
創建⾃定義視圖對象,並指定爲controller 的view。
將⼦視圖控件對象設置爲⾃定義視圖類的屬性,在viewDidLoad⽅法中進 ⾏設置:添加action、設置delegate等等。
在controller中添加按鈕點擊事件實現和代理⽅法的實現。
-(void)loadView
{
   
// 調用父類的方法去加載自身視圖0
  
// [super loadView];
    // loginView 替換控制自帶的view
    LoginView *login = [[LoginView alloc]initWithFrame:[UIScreen mainScreen].bounds];
   
// 幫系統給賦值
   
self.view = login;
    login.
tag = 1000;
    login.
username.tag = 1100;
    login.
password.tag = 1101;
    [login
release];
   
}
// 視圖已經加載完成
- (
void)viewDidLoad {
    [
super viewDidLoad];
   
// Do any additional setup after loading the view.
  
   
//更改自身view的顏色
   
self.view.backgroundColor = [UIColor tiankonglan];
   
   
//控制器中寫邏輯部分
   
// button添加一個點擊方法
   
   
LoginView *view =(LoginView *)self.view;
    [view.
login addTarget:self action:@selector(login:) forControlEvents:UIControlEventTouchUpInside];
    view.
username.text.delegate = self;
    view.
password.text.delegate = self;
}

三、檢測屏幕旋轉
檢測屏幕旋轉
視圖控制器本⾝能檢測到屏幕的旋轉,如果要處理屏幕旋轉,需要重寫⼏個 ⽅法:
/*
 
屏幕旋轉
 
屏幕橫屏改變原來佈局
 
 
豎屏時 豎屏佈局
 1.
允許屏幕選擇
 2.
指定屏幕旋轉的方向
 3.
找到旋轉觸發方法
 4.
判斷屏幕方向更改佈局
 5.
測試一下
 */

//允許屏幕旋轉
-(
BOOL)shouldAutorotate
{
   
return YES;
}
// 指定屏幕旋轉方向
-(
NSUInteger)supportedInterfaceOrientations
{
   
return UIInterfaceOrientationMaskAll;
}
// 旋轉時觸發的方法
-(
void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
   
NSLog(@"%@",NSStringFromCGSize(size));
}

//重新佈局子視圖
//frame發生變化時候會觸發layoutSubview方法
-(
void)layoutSubviews
{
   
//不知道父類做了什麼所有需要在從寫的時候先調用父類方法
   
//然後再寫自己的方法
    [
super layoutSubviews];
   
//frame 發生變化相當於 橫屏了
   
//更改佈局
   
//判斷豎屏還是橫屏
   
//1.把應用程序取出來
   
//2.判斷一下當前應用程序屏幕朝向
   
//單例方法的命名規範share什麼
   
UIApplication *app = [UIApplication sharedApplication];
   
//判斷方向
   
if (app.statusBarOrientation == UIInterfaceOrientationPortrait||app.statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown) {
        
self.password.frame = CGRectMake(self.username.frame.origin.x, self.username.frame.origin.y+KRow, self.username.frame.size.width, self.username.frame.size.height);
    }
else
    {
        
self.password.frame = CGRectMake((self.username.frame.origin.x+10 + self.username.frame.size.width), self.username.frame.origin.y, self.username.frame.size.width, self.username.frame.size.height);
    }
}









四、處理內存警告
處理內存警告
控制器能監測內存警告,以便我們避免內存不夠引起的crash。
在定義的controller⼦類中重寫didReceiveMemoryWarning⽅法。
釋放暫時不使⽤的資源。(數據對象、圖像)
// 接到內存警告觸發的方法
- (
void)didReceiveMemoryWarning {
    [
super didReceiveMemoryWarning];
   
// Dispose of any resources that can be recreated.
   
NSLog(@"內存警告了");
   
// 釋放已經顯示過的並且不是當前顯示的視圖
   
// 如果這個視圖正在被顯示那麼這個視圖的window屬性不是空的
   
if ([self isViewLoaded] == YES && self.view.window ==nil) {
       
//把當前視圖 釋放
       
self.view = nil;
    }
}







五、容器視圖控制器
常⽤⽅法
self.view顯⽰:viewWillAppear: 和 viewDidAppear:
self.view消失:viewWillDisappear: 和 viewDidDisappear:
當self.view添加到⽗視圖上時,執⾏appear⽅法:
當self.view從⽗視 圖上移除時,執⾏disappear⽅法。
演⽰執⾏順序
定義FirstViewController、SecondViewController類,first作爲window 的根視圖控制器。
將SecondViewController的view添加到FirstViewController的view上。
將SecondViewController的view移除。
查看SecondViewController中4個⽅法的執⾏順序。
//如果你不想替換self.view一般都寫在viewDidLoad方法中
   
   
//添加子控制器
  
self.secondVC = [[SeconViewController alloc]init];
   
//secondVC添加成子控制器 rootVC去管理
    [
self addChildViewController:self.secondVC];
   
//seondVC.view 添加到 rootVC.view
    [
self.view addSubview:self.secondVC.view];
   
//釋放
    [
self.secondVC release];
   
self.view.backgroundColor = [UIColor redColor];
   
//添加一個按鈕移除移除子視圖控制器
   
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.
frame = CGRectMake(100, 100, 100, 100);
    button.
backgroundColor = [UIColor brownColor];
   
//添加方法刪除視圖
    [button
addTarget:self action:@selector(delete:) forControlEvents:UIControlEventTouchUpInside];
   
//添加到rootVC.view
    [
self.view addSubview:button];
}
-(void)delete:(UIButton *)button;
{
   // 視圖刪了
    [self.secondVC.view removeFromSuperview];
  // 移除子控制器
    [self.secondVC removeFromParentViewController];
}
// 視圖生命週期
-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    NSLog(@"視圖就要出現");
}
-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    NSLog(@"視圖已經出現");
}
-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    NSLog(@"視圖將要消失");
   
}
-(void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    NSLog(@"視圖已經消失");
}
總結
iOS提供了很多標準組件,標準組件完成我們的需要,但是適當的 封裝,組合⼀個新的控件⽆疑能給我們帶來效率上的提⾼。學會⾃ 定義控件是你成爲⾼⼿的關鍵⼀步。
視圖控制器是MVC中的C,⽤於處理視圖觸發的事件。
處理旋轉和內存警告
發佈了33 篇原創文章 · 獲贊 0 · 訪問量 7616
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章