UI_03 ⾃定義視圖、視圖控制器

⼀、⾃定義label-textField視圖設計模式

自定義LTView類,封裝UILabel與UITextField,實現快速建立如下類型的視圖app

**** 使用UIView子類實現 ****框架

LTView.hide

#import <UIKit/UIKit.h>

佈局

@interface LTView : UIViewatom


@property (nonatomic, retain)UILabel * label;lua

@property (nonatomic, retain)UITextField * textField;spa

- (instancetype)initWithFrame:(CGRect)frame labelText:(NSString *)text placeholder:(NSString *)placeholder delegate:(id<UITextFieldDelegate>)delegate;.net


@end 設計

LTView.m

#import "LTView.h"
#define fWidth frame.size.width
#define fHeight frame.size.height

@implementation LTView

- (
instancetype)initWithFrame:(CGRect)frame labelText:(NSString *)text placeholder:(NSString *)placeholder delegate:(id<UITextFieldDelegate>)delegate
{
   
self = [super initWithFrame:frame];
   
if (self) {
       
UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, fWidth/4, fHeight)];
        label.
text = text;
        [
self addSubview:label];
        [label
release];
       
       
UITextField * textField = [[UITextField alloc] initWithFrame:CGRectMake(fWidth/4, 0, fWidth/4*3, fHeight)];
        textField.
borderStyle = UITextBorderStyleRoundedRect;
        textField.
delegate = delegate;
        [
self addSubview:textField];
        [textField
release];
       
       
self.label = label;
       
self.textField = textField;
       
    }
   
return self;
}

@end

**** 使用類目實現 ****

UIView+LTView.h

#import <UIKit/UIKit.h>

@interface UIView (LTView)

- (
instancetype)initWithFrame:(CGRect)frame labelText:(NSString *)text placeholder:(NSString *)placeholder delegate:(id<UITextFieldDelegate>)delegate;

@end

UIView+LTView.m

#import "UIView+LTView.h"
#define fWidth frame.size.width
#define fHeight frame.size.height

@implementation UIView (LTView)

- (
instancetype)initWithFrame:(CGRect)frame labelText:(NSString *)text placeholder:(NSString *)placeholder delegate:(id<UITextFieldDelegate>)delegate
{

    self = [self initWithFrame:frame];

    if (self) {

        UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, fWidth/4, fHeight)];
        label.
text = text;
        [
self addSubview:label];
        [label
release];
       
       
UITextField * textField = [[UITextField alloc] initWithFrame:CGRectMake(fWidth/4, 0, fWidth/4*3, fHeight)];
        textField.
borderStyle = UITextBorderStyleRoundedRect;
        textField.
delegate = delegate;
        [
self addSubview:textField];
        [textField
release];
       
       
    }
   
return self;
}

@end



⼆、視圖控制器

一、視圖控制器概述

1.1.UIViewController:

     全部視圖控制器的父類

1.2.視圖控制器的功能:

     a.控制視圖

     b.檢測與處理內存警告

     c.檢測屏幕旋轉

     d.管理視圖控制器

1.3.關於self.view

     每個視圖控制器都自帶一個view,其大小和window同樣

二、MVC概述

  • UIViewController是MVC設計模式的核⼼。

  • MVC是⼀個框架級的設計模式。

  • M是Model,主要⽤於建⽴數據模型(即數據的結構)

  • V是View,咱們能看到的全部控件都是view,view主要的功能是展⽰數據。

  • C是控制器,主要是控制M和V的通訊。

三、使用視圖控制器

新建Cocoa Touch Class,指定父類爲UIViewController。

重寫方法:

- (void)loadView; // This is where subclasses should create their custom view hierarchy if they aren't using a nib. Should never be called directly.

做用:

     指定self.view爲特定視圖

注意:

     若是重寫loadView,則self.view=nil,所以必須指定給self.view一個視圖,不然會因死循環崩潰

     若是不重寫loadView,系統會自動建立一個view

 viewgetter方法形成死循環:

- (UIView*)view{

     if(self.view==nil)
     { 
        loadView();

     }

}

- (void)viewDidLoad; //Do any additional setup after loading the view.

做用:

     建立或者初始化self.view(視圖控制器的視圖)以及其子視圖,


四、視圖生命週期

- (void)loadView;     

- (void)viewDidLoad;
- (
void)viewWillAppear:(BOOL)animated;
- (
void)viewDidAppear:(BOOL)animated;
- (
void)viewWillDisappear:(BOOL)animated;

- (void)viewDidDisappear:(BOOL)animated;



3、檢測屏幕旋轉

視圖控制器本⾝能檢測到屏幕的旋轉,若是要處理屏幕旋轉,須要重寫⼏個 ⽅法

一、處理屏幕旋轉

//設置設備支持的方向,默認支持全部設置中開啓的方向,若設置如此,則支持正、左、右三個方向,在開發中不會使用Upside Down

- (NSUInteger)supportedInterfaceOrientations

{

    return UIInterfaceOrientationMaskPortrait;  //只支持垂直正方向

}
//屏幕將要旋轉(棄用):(應用:音樂或視頻暫停;視圖的交互關閉)
- (
void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{}
//
- (
void)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{}
//屏幕旋轉完畢(棄用):(應用:音樂或視頻取消暫停;視圖的交互打開)

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{}


圖1 設置設備支持的方向

二、視圖處理

視圖控制器會⾃動調整view的⼤⼩以適應屏幕旋轉,當設備方向改變時,bounds被修改,觸發view的layoutSubviews⽅法。重寫view中的layoutSubviews方法,從新佈局。

//獲取當前屏幕的方向

#define Orientation [UIApplication sharedApplication].statusBarOrientation

- (void)layoutSubviews
{
   
//判斷當前設備的方向
   
if (Orientation == UIDeviceOrientationLandscapeLeft || Orientation == UIDeviceOrientationLandscapeRight) {
       
self.username.frame = CGRectMake(200, 100, 240, 30);
    }
else {
       
self.username.frame = CGRectMake(50, 100, 240, 30);
    }

}

注:因爲開發中更多地使用autolayout、sizeclasses,故在此不作過多說明



4、處理內存警告

當內存不夠用時,系統發出內存警告,從AppDelegate.m中的- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application{}開始,依次向視圖控制器回收內存。如下爲視圖控制器中的示例:

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    //若是視圖控制器管理的view被加載過(建立),而且沒有顯示在window上,則把view銷燬

    //self.view.window等於nil<==>該視圖沒有被顯示
   
if ([self isViewLoaded] && !self.view.window) {
       
self.view = nil;
    }

}



5、容器視圖控制器

圖片摘自:原文連接        譯文連接

ListAndTree

NavLayout

PanelLayout

SplitViewLayout

MenuViewHierarchy

TabBarHierarchy

相關文章
相關標籤/搜索