OC--UIViewController基礎(chǔ)知識(shí)整理

alloc init

//這個(gè) 方法是在viewdidload之前加載的震嫉,以nib文件加載必然會(huì)調(diào)用此方法,但是代碼加載也是會(huì)自動(dòng)調(diào)用的审残,因此可以將一些數(shù)組創(chuàng)建秸抚,標(biāo)題命名等初始化操作寫(xiě)在這里
//1.如果在初始化UIViewController指定了xib文件名掰吕,就會(huì)根據(jù)傳入的xib文件名加載對(duì)應(yīng)的xib文件
//2.如果沒(méi)有明顯地傳xib文件名([[MJViewController alloc] init];),就會(huì)加載跟UIViewController同名的xib文件
//3.如果沒(méi)有找到相關(guān)聯(lián)的xib文件,就會(huì)創(chuàng)建一個(gè)空白的UIView涛碑,然后賦值給UIViewController的view屬性
- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER;
//NSCoding協(xié)議
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
//這個(gè)UIViewController的nib名字
@property(nullable, nonatomic, readonly, copy) NSString *nibName;
//這個(gè)UIViewController的nibBundle
@property(nullable, nonatomic, readonly, strong) NSBundle *nibBundle;
//這個(gè)UIViewControlle所在的Storyboar
@property(nullable, nonatomic, readonly, strong) UIStoryboard *storyboard NS_AVAILABLE_IOS(5_0);

loadView

//如果獲取self.view,如果沒(méi)有現(xiàn)實(shí)[self loadView]嗜暴,就是調(diào)用Subclasses的loadView方法凸克。
@property(null_resettable, nonatomic,strong) UIView *view;

//loadView里面自定義self.view
- (void)loadView;

//iOS9之前
//有些時(shí)候因?yàn)樾枰謩?dòng)調(diào)用loadview
//但是有風(fēng)險(xiǎn),系統(tǒng)不再調(diào)用viewDidLoad
//所以手動(dòng)調(diào)用loadview是錯(cuò)誤的

//iOS9之后
//出現(xiàn)了loadViewIfNeeded解決了這個(gè)問(wèn)題
//調(diào)用這個(gè)方法視圖會(huì)創(chuàng)建出來(lái)并且不會(huì)忽略viewDidLoad
- (void)loadViewIfNeeded NS_AVAILABLE_IOS(9_0);

//返回加載完的self.view
@property(nullable, nonatomic, readonly, strong) UIView *viewIfLoaded NS_AVAILABLE_IOS(9_0);

//view是否加載完成
@property(nonatomic, readonly, getter=isViewLoaded) BOOL viewLoaded ;
- (BOOL)isViewLoaded ;

Storyboary相關(guān)

//Storyboar跳轉(zhuǎn)擺好的界面
//identifier:設(shè)置好的界面連線(就是Storyboar中VC與VC那條線)
//sender:發(fā)送者
- (void)performSegueWithIdentifier:(NSString *)identifier sender:(nullable id)sender NS_AVAILABLE_IOS(5_0);

//看看能不能跳轉(zhuǎn)闷沥,主要是看identifier對(duì)不對(duì)
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(nullable id)sender NS_AVAILABLE_IOS(6_0);


//準(zhǔn)備處理萎战,
//segue:用來(lái)判斷是哪個(gè)segue,里面有identifier舆逃、sourceViewController蚂维、destinationViewController可以各種操作
//sender:發(fā)送者
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(nullable id)sender NS_AVAILABLE_IOS(5_0);

//Unwind Segue相關(guān),(不明白路狮,留著慢慢玩)
- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender NS_AVAILABLE_IOS(6_0);
- (NSArray<UIViewController *> *)allowedChildViewControllersForUnwindingFromSource:(UIStoryboardUnwindSegueSource *)source NS_AVAILABLE_IOS(9_0);
- (nullable UIViewController *)childViewControllerContainingSegueSource:(UIStoryboardUnwindSegueSource *)source NS_AVAILABLE_IOS(9_0);
- (nullable UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(nullable id)sender NS_DEPRECATED_IOS(6_0, 9_0);
- (void)unwindForSegue:(UIStoryboardSegue *)unwindSegue towardsViewController:(UIViewController *)subsequentVC NS_AVAILABLE_IOS(9_0);
- (nullable UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(nullable NSString *)identifier NS_DEPRECATED_IOS(6_0, 9_0);

生命周期函數(shù)

//系統(tǒng)的loadview完成后虫啥,執(zhí)行viewDidLoad
- (void)viewDidLoad;
//這幾個(gè)生命周期方法,必須熟悉
- (void)viewWillAppear:(BOOL)animated;
- (void)viewDidAppear:(BOOL)animated;
- (void)viewWillDisappear:(BOOL)animated;
- (void)viewDidDisappear:(BOOL)animated;
- (void)viewWillLayoutSubviews NS_AVAILABLE_IOS(5_0);
- (void)viewDidLayoutSubviews NS_AVAILABLE_IOS(5_0);
- (void)didReceiveMemoryWarning;

單個(gè)viewController的生命周期

1奄妨、initWithCoder:(NSCoder *)aDecoder:(如果使用storyboard或者xib)
2涂籽、loadView:加載view
3、viewDidLoad:view加載完畢
4砸抛、viewWillAppear:控制器的view將要顯示
5评雌、viewWillLayoutSubviews:控制器的view將要布局子控件
6、viewDidLayoutSubviews:控制器的view布局子控件完成锰悼,這期間系統(tǒng)可能會(huì)多次調(diào)用viewWillLayoutSubviews 柳骄、    viewDidLayoutSubviews 倆個(gè)方法
7、viewDidAppear:控制器的view完全顯示
8箕般、viewWillDisappear:控制器的view即將消失的時(shí)候
9耐薯、這期間系統(tǒng)也會(huì)調(diào)用viewWillLayoutSubviews 、viewDidLayoutSubviews 兩個(gè)方法
10、viewDidDisappear:控制器的view完全消失的時(shí)候

多個(gè)viewControllers跳轉(zhuǎn)

當(dāng)我們點(diǎn)擊push的時(shí)候首先會(huì)加載下一個(gè)界面然后才會(huì)調(diào)用界面的消失方法
1曲初、initWithCoder:(NSCoder *)aDecoder:ViewController2 (如果用xib創(chuàng)建的情況下)
2体谒、loadView:ViewController2
3、viewDidLoad:ViewController2
4臼婆、viewWillDisappear:ViewController1 將要消失
5抒痒、viewWillAppear:ViewController2 將要出現(xiàn)
6、viewWillLayoutSubviews ViewController2
7颁褂、viewDidLayoutSubviews ViewController2
8故响、viewWillLayoutSubviews:ViewController1
9、viewDidLayoutSubviews:ViewController1
10颁独、viewDidDisappear:ViewController1 完全消失
11彩届、viewDidAppear:ViewController2 完全出現(xiàn)
//nav標(biāo)題
@property(nullable, nonatomic,copy) NSString *title;

@property(nullable,nonatomic,weak,readonly) UIViewController *parentViewController;//父控制器
@property(nullable, nonatomic,readonly) UIViewController *presentedViewController;//第二者
@property(nullable, nonatomic,readonly) UIViewController *presentingViewController;//第一者

//例子
UIViewController *vcB = [[UIViewController alloc] init];
[self addChildViewController:vcB];
NSLog(@"%@", vcB.parentViewController);//self

UIViewController *vcB = [[UIViewController alloc] init];
[self presentViewController:vcB animated:YES completion:^{}];
    
NSLog(@"%@", self.presentedViewController);//vcB
NSLog(@"%@", self.presentingViewController);//nil
    
NSLog(@"%@", vcB.presentedViewController);//nil
NSLog(@"%@", vcB.presentingViewController);//self

//UIViewController的edgesForExtendedLayout屬性默認(rèn)值是UIRectEdgeAll,指定控制器將它的視圖延伸到屏幕的邊緣并在bar下面誓酒。如果屬性值為:UIRectEdgeNone樟蠕,控制器視圖遇到bar的邊界就不延伸了。
@property(nonatomic,assign) UIRectEdge edgesForExtendedLayout ; // Defaults to UIRectEdgeAll

//UIViewController的extendedLayoutIncludesOpaqueBars屬性可以控制以上屬性的有效性靠柑,默認(rèn)值為NO,指定edgesForExtendedLayout在遇到不透明的bar時(shí)無(wú)效寨辩,即不延展。設(shè)置值為YES歼冰,則在遇到透明或不透明的bar情況下都會(huì)延展靡狞。
@property(nonatomic,assign) BOOL extendedLayoutIncludesOpaqueBars ; // Defaults to NO, but bars are translucent by default on 7_0.

//UIViewController的automaticallyAdjustsScrollViewInsets默認(rèn)為YES,指定控制器在有UIScrollView及其子類(lèi)并且在有導(dǎo)航欄或工具欄或標(biāo)簽欄情況下,會(huì)自動(dòng)調(diào)整其contentInset屬性隔嫡。如果是導(dǎo)航欄contentInset.top = 64,如果是標(biāo)簽欄contentInset.bottom = 44.
//可以將該屬性設(shè)置為NO,取消這種行為耍攘。
@property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets ; // Defaults to YES

UIStatusBar相關(guān)的設(shè)置iOS-UIStatusBar詳細(xì)總結(jié)

- (UIStatusBarStyle)preferredStatusBarStyle ;
- (BOOL)prefersStatusBarHidden ;
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation

UIModalTransitionStyle是彈出模態(tài)ViewController時(shí)的四種動(dòng)畫(huà)風(fēng)格

typedef NS_ENUM(NSInteger, UIModalTransitionStyle) {
    UIModalTransitionStyleCoverVertical = 0,//是從底部滑入,默認(rèn)
    UIModalTransitionStyleFlipHorizontal ,  //是水平翻轉(zhuǎn)
    UIModalTransitionStyleCrossDissolve,    //是交叉溶解
    UIModalTransitionStylePartialCurl,      //是翻書(shū)效果
};

UIModalPresentationStyle是彈出模態(tài)ViewController時(shí)彈出風(fēng)格
Present ViewController詳解

typedef NS_ENUM(NSInteger, UIModalPresentationStyle) {
    UIModalPresentationFullScreen = 0,      //是彈出VC時(shí),VC充滿全屏
    UIModalPresentationPageSheet ,          //是如果設(shè)備橫屏畔勤,VC的顯示方式則從橫屏下方開(kāi)始
    UIModalPresentationFormSheet ,          //是VC顯示都是從底部,寬度和屏幕寬度一樣
    UIModalPresentationCurrentContext ,     //是VC的彈出方式和VC父VC的彈出方式相同
    UIModalPresentationCustom ,             //自定義
    UIModalPresentationOverFullScreen ,     //
    UIModalPresentationOverCurrentContext , //
    UIModalPresentationPopover ,            //
    UIModalPresentationNone ,               //
};

如何present一個(gè)半透明的ViewController

- (void)btnOnClick:(id)sender {
    UIViewController *test = [[UIViewController alloc] init];
    self.definesPresentationContext = YES;
    test.view.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:.4];
    test.modalPresentationStyle = UIModalPresentationOverCurrentContext;
    [self presentViewController:test animated:YES completion:nil];
}

UIContentContainer
iOS8之后扒磁,加入了新的一組協(xié)議庆揪,UIViewController對(duì)這組協(xié)議提供了默認(rèn)的實(shí)現(xiàn),我們自定義ViewConttroller的時(shí)候可以重寫(xiě)這些方法來(lái)調(diào)整視圖布局妨托。(先放放缸榛,等有時(shí)間在研究使用)

@protocol UIContentContainer <NSObject>

@property (nonatomic, readonly) CGSize preferredContentSize NS_AVAILABLE_IOS(8_0);

//當(dāng)一個(gè)容器ViewController的ChildViewController的preferredContentSize值改變時(shí),UIKit會(huì)調(diào)用這個(gè)方法告訴當(dāng)前容器ViewController兰伤。我們可以在這個(gè)方法里根據(jù)新的Size對(duì)界面進(jìn)行調(diào)整内颗。
- (void)preferredContentSizeDidChangeForChildContentContainer:(id <UIContentContainer>)container NS_AVAILABLE_IOS(8_0);

//當(dāng)一個(gè)容器ViewController的ChildViewController的systemLayoutFittingSize值改變時(shí),UIKit會(huì)調(diào)用這個(gè)方法告訴當(dāng)前容器ViewController敦腔。我們可以在這個(gè)方法里根據(jù)新的Size對(duì)界面進(jìn)行調(diào)整均澳。
- (void)systemLayoutFittingSizeDidChangeForChildContentContainer:(id <UIContentContainer>)container NS_AVAILABLE_IOS(8_0);

//viewWillTransitionToSize:withTransitionCoordinator:調(diào)用的時(shí)候
- (CGSize)sizeForChildContentContainer:(id <UIContentContainer>)container withParentContainerSize:(CGSize)parentSize NS_AVAILABLE_IOS(8_0);

//TransitionToSize:動(dòng)畫(huà)方面觸發(fā)?
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator NS_AVAILABLE_IOS(8_0);

//什么鬼啊找前?
- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator NS_AVAILABLE_IOS(8_0);

@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末糟袁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子躺盛,更是在濱河造成了極大的恐慌项戴,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件槽惫,死亡現(xiàn)場(chǎng)離奇詭異周叮,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)界斜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)仿耽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人锄蹂,你說(shuō)我怎么就攤上這事氓仲。” “怎么了得糜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵敬扛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我朝抖,道長(zhǎng)啥箭,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任治宣,我火速辦了婚禮急侥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侮邀。我一直安慰自己坏怪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布绊茧。 她就那樣靜靜地躺著铝宵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪华畏。 梳的紋絲不亂的頭發(fā)上鹏秋,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音亡笑,去河邊找鬼侣夷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛仑乌,可吹牛的內(nèi)容都是我干的百拓。 我是一名探鬼主播琴锭,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼耐版!你這毒婦竟也來(lái)了祠够?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤粪牲,失蹤者是張志新(化名)和其女友劉穎古瓤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體腺阳,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡落君,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亭引。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绎速。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雄可,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布萌京,位于F島的核電站,受9級(jí)特大地震影響宏浩,放射性物質(zhì)發(fā)生泄漏知残。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一比庄、第九天 我趴在偏房一處隱蔽的房頂上張望求妹。 院中可真熱鬧,春花似錦佳窑、人聲如沸制恍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吧趣。三九已至,卻和暖如春耙厚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岔霸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工薛躬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呆细。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓型宝,卻偏偏與公主長(zhǎng)得像八匠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子趴酣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • /* UIViewController is a generic controller base class th...
    DanDanC閱讀 1,814評(píng)論 0 2
  • 27梨树、ViewController的didReceiveMemoryWarning是在什么時(shí)候調(diào)用的?默認(rèn)的操作是...
    煙雨平生花飛舞閱讀 580評(píng)論 0 1
  • 廢話不多說(shuō)岖寞,直接上干貨 ---------------------------------------------...
    小小趙紙農(nóng)閱讀 3,361評(píng)論 0 15
  • 麻將藻雪,是一種四人參加的游戲,各個(gè)地方有各個(gè)地方的打麻將規(guī)則狸吞,牌數(shù)也不大一樣勉耀。據(jù)說(shuō)打麻將這一風(fēng)氣盛行于明朝,相傳是一...
    木易每文閱讀 1,234評(píng)論 0 2
  • 言凡 一個(gè)人蹋偏, 獨(dú)步于鄉(xiāng)間小路便斥,夜的帷幕悄無(wú)聲息地輕輕滑落,周?chē)察o的似乎沒(méi)有一點(diǎn)聲音暖侨。 漸行漸遠(yuǎn)椭住, 心,也變得寧...
    b825aefd4d93閱讀 277評(píng)論 0 0