iOS7 SDK各類坑——手Q團隊總結

 http://s.p.qq.com/pub/show?p=82e0c8d9&id=4f6fdb7610fed&plg_auth=1&pt=4&puin=2195769561&idx=1&st=3

2014年04月14日

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

相關文章
相關標籤/搜索