antonyzhao(趙峯) SNG即通產品部\平臺開發組副組長app
IViewController佈局佈局
wantsFullScreenLayout已經做廢了,取而代之是測試
一、edgesForExtendedLayoutui
這個屬性是UIExtendedEdge類型,用來制定視圖的哪條邊須要擴展。好比UIRectEdgeTop,它把視圖區域頂部擴展到statusBar(之前是navigationBar下面);UIRectEdgeBottom是把區域底部擴展到屏幕下方邊緣。默認值是UIRectEdgeAll。url
二、extendedLayoutIncludesOpaqueBarsdebug
若是你使用了不透明的導航欄,設置edgesForExtendedLayout的時候也請將 extendedLayoutIncludesOpaqueBars的值設置爲No(默認值是YES)。指針
三、automaticallyAdjustsScrollViewInsets對象
爲YES時,它會找view裏的scrollView,並設置scrollView的contentInset爲{64, 0, 0, 0}。若是你不想讓scrollView的內容自動調整,將這個屬性設爲NO(默認值YES)。繼承
目前QQ重載了wantsFullScreenLayout屬性方法:索引
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
- (void)QQSetWantsFullScreenLayout:(BOOL)wantsFullScreenLayout
{
if (SYSTEM_VERSION >= 7.0) {
if (wantsFullScreenLayout == NO) {
self.automaticallyAdjustsScrollViewInsets = NO;
self.extendedLayoutIncludesOpaqueBars = NO;
self.edgesForExtendedLayout = UIRectEdgeLeft | UIRectEdgeBottom | UIRectEdgeRight;
} else {
self.automaticallyAdjustsScrollViewInsets = NO; // 建議手工設置
self.extendedLayoutIncludesOpaqueBars = NO;
self.edgesForExtendedLayout = UIRectEdgeAll;
}
}
[self QQSetWantsFullScreenLayout:wantsFullScreenLayout];
}
#endif
QQViewController在初始化時,self.wantsFullScreenLayout=NO。也就是
self.automaticallyAdjustsScrollViewInsets = NO;
self.extendedLayoutIncludesOpaqueBars = NO;
self.edgesForExtendedLayout = UIRectEdgeLeft | UIRectEdgeBottom | UIRectEdgeRight;
· UITabBarController的視圖結構變了
iOS7如下,UITransitionView和UITabBar是不能重疊的。而iOS7兩個view是能夠互相重疊。這影響咱們自定義TabBar的實現機制(具體看QQTabBarController的實現方式)。
· iOS7的UITableViewCell
一、iOS7下cell的backgroundColor爲whiteColor,要手工設置爲clearColor。
二、之前能夠直接繼承UITableViewCell而後drawRect。可是如今不行了,如今的UITableViewCell包含了一個scrollView,你重繪了UITableViewCell將會被這個scrollView遮住而徹底無法顯示。並且不要試圖經過[cell.contentView viewWithTag]來獲取裏面的subview。
三、若是設置backgroundView和selectedBackgroundView,滑動刪除時會發現backgroundView會右移直到覆蓋刪除按鈕。目前解決辦法是在cell layoutSubviews方法重設backgroundView和selectedBackgroundView的frame:
- (void)layoutSubviews
{
[super layoutSubviews];
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
if (SYSTEM_VERSION >= 7.0) {
self.backgroundView.frame = self.bounds;
self.selectedBackgroundView.frame = self.bounds;
}
#endif
}
四、索引背景條backgroundColor默認爲whiteColor,要把它改成clearColor:
[[UITableView appearance] setSectionIndexBackgroundColor:[UIColor clearColor]];
對應tapd bug:
http://tapd.oa.com/v3/10066451/bugtrace/bugs/view?bug_id=1010066451048986804&url_cache_key=74876e4d2f0fea09480c42284f702c98
· iOS7基於viewController隱藏狀態條
經過ViewController重載方法返回枚舉值來控制狀態欄的隱藏和樣式。
首先,須要在Info.plist配置文件中,增長鍵:UIViewControllerBasedStatusBarAppearance,並設置爲YES;
而後,在UIViewController子類中實現如下兩個方法:
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
- (BOOL)prefersStatusBarHidden
{
return NO;
}
最後,在須要刷新狀態欄樣式的時候,調用[self setNeedsStatusBarAppearanceUpdate]方法便可刷新。
目前QQ是把UIViewControllerBasedStatusBarAppearance設爲NO,而後根據主題配置項統一設置statusBar的樣式
· UINavigationBar和UINavigationBarItem
一、在iOS7下,若是設置的背景圖大於88像素,則它會自動拉伸到狀態欄。(白色皮膚切圖有點bug,背景圖高度爲89像素)
二、若是UINavigationBarItem是自定義CustomView,則效果以下
按鈕會在左邊(右邊)留下很多空白。目前解決方法是在leftBarButtonItem(rightBarButtonItem)左邊加一個width爲-十、BarButtonSystemItem爲UIBarButtonSystemItemFixedSpace的UIBarButtonItem。參考代碼在UINavigationItem+SwizzleMethod.m。
· UISearchBar和UISearchDisplayController
一、測試在測試iOS7 SDK兼容性時,發現導航欄和搜索框之間有一條莫名其妙的線:
經debug分析,之前UISearchBar的子view有好幾個,包括背景圖view、輸入框view等。如今只有一個子view,而背景圖和輸入框等在這個子view裏。當table移動時,這個子view的frame也在不停變化,當table移動到最上面時,子view的frame.origin.y=0.5,而view. clipToBounds=YES,從而露出了viewController背景圖頂部的一條線……
二、給UISearchDisplayController設置delegate後,在UISearchDisplayController不用了的時候(好比release他以前),務必要setDelegate = nil。不然可能會出野指針(某已釋放的對象)被調用
self.searchDisplay.delegate = nil;
· UILabel、UITextView、NSString的一些事
一、sizeWithFont、drawInRect等NSString的排版和繪製接口已經DEPRECATED,取而代之是sizeWithAttributes、drawInRect:withAttributes。
二、咱們常常先用sizeWithFont對字符串進行排版,而後設置UILabel的frame,在iOS7,可能出現下面問題
UILabel的內容顯示不完整,解決辦法是UILabel調用sizeToFit。
三、UITextView如今設置 text後contentSize返回大小和frame同樣,因此須要用sizeThatFits來替換。
·使用iOS7 SDK新特性致使iOS6 SDK編譯不過的解決辦法
例如UIStatusBarStyleLightContent是iOS7新的statusBarStyle,那寫代碼時,前面加上宏判斷:
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 70000
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque]; #else [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; #endif