iOS 14 的一些適配問題

UIDatePicker

在 iOS 14 開始,UIDatePicker 默認樣式為:

iOS14 默認樣式

而在 iOS14 之前的樣式是

iOS 14 之前默認樣式

同樣的代碼怀跛,顯示樣式不一樣

UIDatePicker *datePicer = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 200, self.width, 100)];
datePicer.backgroundColor = [UIColor whiteColor];
[self addSubview:datePicer];

雖然有設(shè)置 UIDatePickerframe,但是在 iOS 14 上完全沒有效果,要想在 iOS 14 上顯示跟之前一樣逊拍,還要再設(shè)置 preferredDatePickerStyle 這個屬性為 UIDatePickerStyleWheels.

/// Request a style for the date picker. If the style changed, then the date picker may need to be resized and will generate a layout pass to display correctly.
@property (nonatomic, readwrite, assign) UIDatePickerStyle preferredDatePickerStyle API_AVAILABLE(ios(13.4)) API_UNAVAILABLE(tvos, watchos);

對于這個屬性幻林,是 UIDatePicker 的樣式抡柿,如果樣式發(fā)生了更改冲甘,則可能需要調(diào)整 UIDatePicker 的大小并生成布局展示出來

所以如果只是單單設(shè)置了這個屬性還不行捷雕,還需要再重新設(shè)置 FramebackgroundColor

UIDatePicker *datePicer = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 200, self.width, 100)];
if (@available(iOS 13.4, *)) {
    datePicer.preferredDatePickerStyle = UIDatePickerStyleWheels; // 只設(shè)置了 preferredDatePickerStyle 屬性
}
datePicer.backgroundColor = [UIColor whiteColor];
[self addSubview:datePicer];
只設(shè)置了preferredDatePickerStyle屬性湾蔓,并未改變 Frame
CGRect frame = CGRectMake(0, 200, self.width, 100);
UIDatePicker *datePicer = [[UIDatePicker alloc] initWithFrame:CGRectZero];
if (@available(iOS 13.4, *)) {
    datePicer.preferredDatePickerStyle = UIDatePickerStyleWheels; // 只設(shè)置了 preferredDatePickerStyle 屬性
}
datePicer.backgroundColor = [UIColor whiteColor];
datePicer.frame = frame;
[self addSubview:datePicer];
設(shè)置了樣式并且重新設(shè)置了 Frame

UITableViewCell

在 iOS 14 環(huán)境下瘫析,UITableViewCell 的結(jié)構(gòu)如下:

iOS 14 UITableViewCell 結(jié)構(gòu)

而在 iOS 14 之前,UITableViewCell 的結(jié)構(gòu)如下:

iOS 14 之前 UITableViewCell 結(jié)構(gòu)

對比可以發(fā)現(xiàn),iOS14 多了一個 _UISystemBackgroundView 和一個子視圖
如果我們在cell 中創(chuàng)建新的 UI 控件贬循,然后直接添加到 cell 中,所以在 iOS14 下,如果直接講 UI 空間添加到 cell 上面,默認會放在 contentView 下面,如果有一些交互事件,這時候是無法響應(yīng)的,因為被 contentView 給擋住了,所以需要添加到 contentView 上面.

UIPageControl

在之前,如果想要修改 UIPageControl 默認圖片和選中圖片,需要按照如下方式修改:

[_pageControl setValue:_pageIndicatorImage forKeyPath:@"pageImage"];
[_pageControl setValue:_currentPageIndicatorImage forKeyPath:@"currentPageImage"];

但是在 iOS14 開始,這樣修改直接一個異常,提示調(diào)用過時的私有方法:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Call to obsolete private method -[UIPageControl _setPageImage:]'
異常信息
UIPageControl *pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, 100, self.view.width, 30)];
pageControl.backgroundColor = [UIColor orangeColor];
pageControl.numberOfPages = 6;
    
if (@available(iOS 14.0, *)) {
    pageControl.backgroundStyle = UIPageControlBackgroundStyleMinimal;
    pageControl.allowsContinuousInteraction = false;
    pageControl.preferredIndicatorImage = [UIImage imageNamed:@"page_currentImage"];
    // 目前發(fā)現(xiàn)只能通過這樣的方式去設(shè)置當(dāng)前選中的圖片顏色
    pageControl.currentPageIndicatorTintColor = [UIColor redColor];
    [pageControl setIndicatorImage:[UIImage imageNamed:@"live"] forPage:2];
} else {
    [pageControl setValue:[UIImage imageNamed:@"page_image"] forKeyPath:@"pageImage"];
    [pageControl setValue:[UIImage imageNamed:@"page_currentImage"] forKeyPath:@"currentPageImage"];
}
[self.view addSubview:pageControl];

運行不同環(huán)境

iOS 14 之前環(huán)境

UIPageControl 在 iOS 14 之前樣式

iOS 14 之后環(huán)境

iOS 14 之后環(huán)境

CALayer 的 mask

公司所在的項目中,聊天界面利用CALayermask方式將背景弄成一個氣泡的樣式,在 iOS 14 之前是好的,但是在 iOS 14 上就顯示不出來了.具體的方式是將一個氣泡圖片,用一個 UIImageView 加載出來,然后將這個氣泡的 ImageViewlayer 作為一個遮罩,放在圖片消息上面去.
代碼類似下面的:

UIImageView *imageView = [UIImageView new];
imageView.image = [UIImage imageNamed:@"calendar"];
imageView.size = CGSizeMake(200, 200);
imageView.center = self.center;
[self addSubview:imageView];
    
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 150, 80)];
imgView.image = [UIImage imageNamed:@"green_pop"];
imageView.layer.mask = imgView.layer;

以上代碼運行結(jié)果,在不同的環(huán)境下,顯示出來的效果不一樣

iOS14 環(huán)境下運行結(jié)果.png
iOS12.4環(huán)境下運行結(jié)果.png

iOS14 顯示不出來,但是在 iOS12.4 卻能顯示出來

后面在添加到 imageView.layer.mask 之前,將 imgView 添加到某個視圖上去,發(fā)現(xiàn)在 iOS 14 上又能顯示出來,所以想是不是在 iOS14 上的渲染邏輯發(fā)生了改變

將 imgView 添加到某個視圖上
UIImageView *imageView = [UIImageView new];
imageView.image = [UIImage imageNamed:@"calendar"];
imageView.size = CGSizeMake(200, 200);
imageView.center = self.center;
[self addSubview:imageView];

UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 150, 80)];
imgView.image = [UIImage imageNamed:@"green_pop"];
[imageView addSubview:imgView];
imageView.layer.mask = imgView.layer;

其實可以直接使用 layercontent 進行設(shè)置圖片

將圖片賦值到 content.png
UIImageView *imageView = [UIImageView new];
imageView.image = [UIImage imageNamed:@"calendar"];
imageView.size = CGSizeMake(200, 200);
imageView.center = self.center;
[self addSubview:imageView];
CALayer *maskLayer = [[CALayer alloc] init];
maskLayer.frame = CGRectMake(0, 0, 180, 90);
maskLayer.contents = (__bridge id)[UIImage imageNamed:@"green_pop"].CGImage;
imageView.layer.mask = maskLayer;

這樣也能顯示出來

AssetsLibrary

AssetsLibrary 在 iOS9 已經(jīng)開始被棄用了咸包,但是一些老的項目還在使用這個庫進行相冊訪問,經(jīng)過測試杖虾,同樣的代碼烂瘫,在 iOS 14 下拿到相冊中的圖片之后,獲取圖片的大小已經(jīng)獲取不到了

iOS14 之前獲取圖片大小情況

iOS14之前AssetsLibrary獲取圖片大小

iOS 14 獲取圖片大小情況

iOS14 AssetsLibrary獲取圖片大小

PHPickerViewController 的使用

在 iOS14 增加了一個 PHPickerViewController 對相冊的訪問,替代 UIImagePickerController.

我們可以在 UIImagePickerController.h 文件中看到,蘋果推薦使用 PHPickerViewController 去訪問相冊

UIImagePickerController替換提示.jpg

首先,創(chuàng)建一個 PHPickerConfiguration 進行一些配置

PHPickerConfiguration *configuration = [PHPickerConfiguration new];
configuration.filter = [PHPickerFilter imagesFilter]; // 設(shè)置所選的類型,這里設(shè)置是圖片,默認是 nil,設(shè)置成 nil 則代表所有的類型都顯示出來(包括 視頻/LivePhoto )
configuration.selectionLimit = 10; // 設(shè)置可選擇的最大數(shù),默認為 1

創(chuàng)建 PHPickerViewController , 并進行跳轉(zhuǎn)

PHPickerViewController *picker = [[PHPickerViewController alloc] initWithConfiguration:configuration];
picker.delegate = self;
picker.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:picker animated:YES completion:nil];

實現(xiàn)代理方法 picker:didFinishPicking:results

- (void)picker:(PHPickerViewController *)picker didFinishPicking:(NSArray<PHPickerResult *> *)results  API_AVAILABLE(ios(14)){
    
    [picker dismissViewControllerAnimated:YES completion:nil];
    if (!results || !results.count) return;
    // 遍歷獲取到的結(jié)果
    for (PHPickerResult *result in results) {
        NSItemProvider *itemProvider = result.itemProvider;
        if ([itemProvider canLoadObjectOfClass:UIImage.class]) {
            [itemProvider loadObjectOfClass:UIImage.class
                          completionHandler:^(__kindof id<NSItemProviderReading>  _Nullable object, NSError * _Nullable error) {
                // 取出圖片
                if (!error && object && [object isKindOfClass:UIImage.class]) {
                    NSLog(@"%@", object);
                }
            }];
        }
    }
}
PHPickerViewController的使用.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奇适,一起剝皮案震驚了整個濱河市坟比,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嚷往,老刑警劉巖葛账,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異皮仁,居然都是意外死亡籍琳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門贷祈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趋急,“玉大人,你說我怎么就攤上這事势誊∥卮铮” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵键科,是天一觀的道長闻丑。 經(jīng)常有香客問我,道長勋颖,這世上最難降的妖魔是什么嗦嗡? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮饭玲,結(jié)果婚禮上侥祭,老公的妹妹穿的比我還像新娘。我一直安慰自己茄厘,他們只是感情好矮冬,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著次哈,像睡著了一般胎署。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窑滞,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天琼牧,我揣著相機與錄音恢筝,去河邊找鬼。 笑死巨坊,一個胖子當(dāng)著我的面吹牛撬槽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播趾撵,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼侄柔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了占调?” 一聲冷哼從身側(cè)響起暂题,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妈候,沒想到半個月后敢靡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡苦银,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年啸胧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幔虏。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡纺念,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出想括,到底是詐尸還是另有隱情陷谱,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布瑟蜈,位于F島的核電站烟逊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏铺根。R本人自食惡果不足惜宪躯,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望位迂。 院中可真熱鬧访雪,春花似錦、人聲如沸掂林。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泻帮。三九已至精置,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锣杂,已是汗流浹背氯窍。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工饲常, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狼讨。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像柒竞,于是被迫代替她去往敵國和親政供。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

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

  • UIDatePicker 在 iOS 14 開始,UIDatePicker 默認樣式為: 而在 iOS14 之前的...
    王家小雷閱讀 980評論 0 4
  • 又是一年蘋果發(fā)布會朽基,蘋果更新了新版本的系統(tǒng)iOS14布隔。就我個人來說的話系統(tǒng)耗電有優(yōu)化,小程序類似部件化APP體驗也...
    尼古拉斯佩思閱讀 4,069評論 0 9
  • 1稼虎、UIDatePicker iOS14 UIDatePicker新增加了一個UI樣式 tvos watchos ...
    480a52903ce5閱讀 2,489評論 0 3
  • iOS14 的適配衅檀,很重要的一環(huán)就集中在和方面。 在 iOS13 及以前霎俩,當(dāng)用戶首次訪問應(yīng)用程序時哀军,會被要求開放大...
    vicentwyh閱讀 2,805評論 0 5
  • 久違的晴天,家長會打却。 家長大會開好到教室時杉适,離放學(xué)已經(jīng)沒多少時間了。班主任說已經(jīng)安排了三個家長分享經(jīng)驗柳击。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,523評論 16 22