⼀、⾃定義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
view的getter方法形成死循環:
- (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