1.父子控制器
父子控制器的使用可以大大的精簡代碼的耦合性,可以把比較複雜的界面拆分成多個控制器管理,比如網易新聞滾動新聞的實現,可以把用把多個tableview的控制器,作爲scrollView所在的控制器的子控制器。
給一個控制器加入了導航欄,控制器會自動調用-
(void)didMoveToParentViewController:(UIViewController *)parent
方法,可以在這個方法內添加相應的操作。但是如果是手動調用
- (void)addChildViewController:(UIViewController *)childController ;
被添加的控制器不會調用該方法,只會調用
- (void)willMoveToParentViewController:(UIViewController *)parent
小知識
某些特殊情況需要注意:比如對於一個具有導航欄的控制器A,添加了子控制器B,並且把B的視圖添加到了A上面,希望操作點擊B上面的某個按鈕push到某個控制器C,這時候是可以的,因爲A有了導航欄屬於導航欄的控制器,B是A的自控制器,也同樣是導航欄的子控制器,所以導航欄可以進行push C控制器操作但是,如果A僅僅是將B的視圖放在了自己的子視圖位置,點擊按鈕無效,因爲這個時候B的調用導航欄控制器方法的時候導航欄爲空,沒有辦法進行push操作.
將子控制器的視圖添加到父控制器不一定是全屏幕的,通過多次調用addSubView加入相同的視圖不會造成多次重疊只會讓視圖呈現在最外面。
.默認情況下所有控制器的view的autoresizingMask屬性包含UIViewAutoresizingFlexibleWidth和UIViewAutoresizingFlexibleHeight。所以在添加子控制器的視圖到父控制器view的子視圖如果外觀不正確的話可以考慮將autoresizingMask屬性設置爲None.
tableView
如果想設置不同高度的單元格,可以先
返回每一行的估計高度, 只要返回了估計高度,那麼就會先調用tableView:cellForRowAtIndexPath:方法創建cell,再調用tableView:heightForRowAtIndexPath:方法獲取cell的真實高度
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
想設置tableView多行選中可以自定義數組實現也可以使用:
// 允許在編輯模式進行多選操作
self.tableView.allowsMultipleSelectionDuringEditing = YES;
通過:
NSArray *indexPaths = [self.tableView indexPathsForSelectedRows];
獲取獲取選中的行。
scrollView
UIScrollView內部子控件添加約束的注意點:
1.子控件的尺寸不能通過UIScrollView來計算,可以考慮通過以下方式計算
可以設置固定值(width==100,height==300)
可以相對於UIScrollView以外的其他控件來計算尺寸
2.UIScrollView的frame應該通過子控件以外的其他控件來計算
3.UIScrollView的contentSize通過子控件來計算
根據子控件的尺寸以及子控件與UIScrollView之間的間距
scrollView結束了滾動動畫以後就會調用這個方法(比如- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated;方法執行的動畫完畢後)會調用下面方法
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
手指鬆開scrollView後,scrollView停止減速完畢就會調用這個
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView