iOS11 適配問題總結(jié)

UITableView篇

自定義TableViewCell拖拽事件后,在iOS11上滑動TableView衣式,界面元素會消失俯艰。

解決方法:
if (@available(iOS 11, *)) {
    self.tableView.estimatedRowHeight = 0;
    self.tableView.estimatedSectionHeaderHeight = 0;
    self.tableView.estimatedSectionFooterHeight = 0;
    }

系統(tǒng)默認的左滑刪除事件中权悟,左滑的距離可以過長的問題,而且當(dāng)你full swipe(完全滑動)的時候陨享,系統(tǒng)會自動執(zhí)行第一個action的handler葱淳。


2333461-fc9267cdb472ae54.png

iOS8之后新增了代理方法tableView: editActionsForRowAtIndexPath:和類UITableViewRowAction,可以在這個代理方法中定義所需要的操作按鈕(刪除抛姑、置頂?shù)?赞厕,這些按鈕的類就是UITableViewRowAction。這個類只能定義按鈕的顯示文字定硝、背景色皿桑、和按鈕事件。
并且返回數(shù)組的第一個元素在UITableViewCell的最右側(cè)顯示蔬啡,最后一個元素在最左側(cè)顯示诲侮。iOS 11可以給這些按鈕添加圖片了,而且如果實現(xiàn)了以下兩個iOS 11新增的代理方法箱蟆,將會取代tableView: editActionsForRowAtIndexPath:代理方法:

- ( UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath {
    //刪除
    UIContextualAction *deleteAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleDestructive title:@"delete" handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
        [self deleteObject:indexPath];
    }];
    deleteAction.image = [UIImage imageNamed:@"del"];
    deleteAction.backgroundColor = [UIColor redColor];

    UISwipeActionsConfiguration *config = [UISwipeActionsConfiguration configurationWithActions:@[deleteAction]];
    return config;
}

typedef NS_ENUM(NSInteger, UIContextualActionStyle) {
    UIContextualActionStyleNormal,
    UIContextualActionStyleDestructive
}

UIContextualActionStyle有兩種類型沟绪,如果是置頂、已讀等按鈕就使UIContextualActionStyleNormal類型空猜,delete操作按鈕可使用UIContextualActionStyleDestructive類型绽慈,當(dāng)使用該類型時,如果是左滑操作辈毯,一直滑動某個cell坝疼,會直接執(zhí)行刪除操作,不用再點擊刪除按鈕漓摩,即系統(tǒng)會自動執(zhí)行第一個action的handler裙士。當(dāng)然了,如果產(chǎn)品需求是必須跟之前風(fēng)格統(tǒng)一只能點“刪除”按鈕才能刪除而且不能左滑距離過長就不能直接這么用了管毙。

解決方法1:

 //iOS11及以上
#ifdef __IPHONE_11_0
- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos){
UIContextualAction *action=[UIContextualAction contextualActionWithStyle:UIContextualActionStyleNormal title:@"刪除" handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
    [self deleteRecord:indexPath];
}];
action.backgroundColor = [UIColor redColor];
UISwipeActionsConfiguration *config=[UISwipeActionsConfiguration configurationWithActions:@[action]];
config.performsFirstActionWithFullSwipe = NO;
return config;
}
#endif

解決方法2:

仿微信效果通過pan手勢自定義左滑事件解決腿椎。

詳細代碼見demo:
https://github.com/WSGNSLog/EditTableView

iOS11 無法跳轉(zhuǎn)設(shè)置頁--做到了跳轉(zhuǎn)設(shè)置頁桌硫,但不是指定設(shè)置頁
參照:http://www.reibang.com/p/527c7098add5

判斷ios11 系統(tǒng)的宏這樣寫 不會報警告

#define IOS11 @available(iOS 11.0, *)

//判斷是iPhoneX 的宏

#define is_iPhoneX [UIScreen mainScreen].bounds.size.width == 375.0f && [UIScreen mainScreen].bounds.size.height == 812.0f

keyWindow獲取

iOS 11之前通過 [[UIApplication sharedApplication].windows lastObject]獲取keyWindow沒有問題,iOS11多了一個UIRemoteKeyboardWindow啃炸,改為通過[UIApplication sharedApplication].keyWindow獲取

po [UIApplication sharedApplication].windows

<__NSArrayM 0x1c085f410>(
<UIWindow: 0x103e14170; frame = (0 0; 414 736); autoresize = W+H; gestureRecognizers = <NSArray: 0x1c405ee10>; layer = <UIWindowLayer: 0x1c4039820>>,
<UITextEffectsWindow: 0x1048f7800; frame = (0 0; 414 736); opaque = NO; autoresize = W+H; layer = <UIWindowLayer: 0x1c403ae00>>,
<UIRemoteKeyboardWindow: 0x104100c00; frame = (0 0; 414 736); opaque = NO; autoresize = W+H; layer = <UIWindowLayer: 0x1c04306c0>>
)

iPhone X Push過程中TabBar位置上移

UINavigationController的基類重寫pushViewController代理方法铆隘,在Push的時候修正一下TabBarframe

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (self.viewControllers.count > 0) {
            viewController.hidesBottomBarWhenPushed = YES;
        }
    [super pushViewController:viewController animated:animated];
    // 修改tabBra的frame
    CGRect frame = self.tabBarController.tabBar.frame;
    frame.origin.y = [UIScreen mainScreen].bounds.size.height - frame.size.height;
    self.tabBarController.tabBar.frame = frame;
}

其他跳動問題解決

在繼承于系統(tǒng)UITabBar的子類加上下面代碼

#import "XYTabBar.h"

@interface XYTabBar()

@property (nonatomic,assign)UIEdgeInsets oldSafeAreaInsets;

@end

@implementation XYTabBar

- (void) safeAreaInsetsDidChange
{
    [super safeAreaInsetsDidChange];
    if(self.oldSafeAreaInsets.left != self.safeAreaInsets.left ||
       self.oldSafeAreaInsets.right != self.safeAreaInsets.right ||
       self.oldSafeAreaInsets.top != self.safeAreaInsets.top ||
       self.oldSafeAreaInsets.bottom != self.safeAreaInsets.bottom)
    {
        self.oldSafeAreaInsets = self.safeAreaInsets;
        [self invalidateIntrinsicContentSize];
        [self.superview setNeedsLayout];
        [self.superview layoutSubviews];
    }

}

- (CGSize) sizeThatFits:(CGSize) size
{
    CGSize s = [super sizeThatFits:size];
    if(@available(iOS 11.0, *))
    {
        CGFloat bottomInset = self.safeAreaInsets.bottom;
        if( bottomInset > 0 && s.height < 50) {
            s.height += bottomInset;
        }
    }
    return s;
}
@end

參考:http://blog.csdn.net/xuyang844175181/article/details/78134552

Xcode9出現(xiàn)錯誤safe area layout guide before ios 9 真正解決辦法:

正解是選中控制器,右邊面板的Builds for 選擇iOS9.0 and Later南用,如下圖紅框
廣為流傳的錯解是不勾選Use Safe Area Layout Guides膀钠,如下圖灰框,會導(dǎo)致用不了iOS的這個新功能了
513608-20171124103405468-1557984758.png
UITableView頂部空白

設(shè)置:

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, CGFLOAT_MIN)];
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, CGFLOAT_MIN)];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末裹虫,一起剝皮案震驚了整個濱河市肿嘲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌筑公,老刑警劉巖雳窟,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異匣屡,居然都是意外死亡封救,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門捣作,熙熙樓的掌柜王于貴愁眉苦臉地迎上來誉结,“玉大人,你說我怎么就攤上這事券躁〕涂樱” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵嘱朽,是天一觀的道長旭贬。 經(jīng)常有香客問我,道長搪泳,這世上最難降的妖魔是什么稀轨? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮岸军,結(jié)果婚禮上奋刽,老公的妹妹穿的比我還像新娘。我一直安慰自己艰赞,他們只是感情好佣谐,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著方妖,像睡著了一般狭魂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天雌澄,我揣著相機與錄音斋泄,去河邊找鬼。 笑死镐牺,一個胖子當(dāng)著我的面吹牛炫掐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播睬涧,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼募胃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了畦浓?” 一聲冷哼從身側(cè)響起痹束,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宅粥,沒想到半個月后参袱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡秽梅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了剿牺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片企垦。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖晒来,靈堂內(nèi)的尸體忽然破棺而出钞诡,到底是詐尸還是另有隱情,我是刑警寧澤湃崩,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布荧降,位于F島的核電站,受9級特大地震影響攒读,放射性物質(zhì)發(fā)生泄漏朵诫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一薄扁、第九天 我趴在偏房一處隱蔽的房頂上張望剪返。 院中可真熱鬧,春花似錦邓梅、人聲如沸脱盲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钱反。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間面哥,已是汗流浹背哎壳。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留幢竹,地道東北人耳峦。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像焕毫,于是被迫代替她去往敵國和親蹲坷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

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