激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - IOS - IOS11新特性與兼容適配

IOS11新特性與兼容適配

2021-04-06 15:15iOS開發網 IOS

iOS 11正式發布了,下面整理了一些該版本下的特點還有如何進行兼容適配工作需要做的事情,希望能夠給你提供到幫助。

ios11發布以來,很多新的特性為開發工作提供了方便,小編在此給大家介紹一下ios11的新特性以及在兼容適配等做的工作。

1. uiview變化

1.1. 更加方便的rtl邊距設置

在之前的系統中我們會使用layoutmargins來獲取和設置控件顯示內容部分的邊緣與控件邊緣的距離。在ios 11中,新增directionallayoutmargins屬性來指定邊距。這兩個屬性的結構定義如下:

?
1
2
3
4
5
6
7
typedef struct uiedgeinsets {
cgfloat top, left, bottom, right;
} uiedgeinsets;
////
typedef struct nsdirectionaledgeinsets {
cgfloat top, leading, bottom, trailing;
} nsdirectionaledgeinsets

從結構上看主要是將uiedgeinsets結構的left和right調整為nsdirectionaledgeinsets結構的leading和trailing。這一調整主要是為了right to left(rtl)語言下可以進行自動適配,例如:要實現文本每行尾部邊距設置為30px,在以前做法則需要判斷語言來區分哪些是rtl語言,然后再做設置,如:

?
1
2
3
4
5
6
7
8
9
if ([uiview userinterfacelayoutdirectionforsemanticcontentattribute:self.view.semanticcontentattribute] == uiuserinterfacelayoutdirectionrighttoleft)
{
// right to left 語言下每行尾部在左邊
self.view.layoutmargins.left = 30;
}
else
{
self.view.layoutmargins.right = 30;
}

ios 11 后則可以一步到位,如:

?
1
self.view.directionallayoutmargins = nsdirectionaledgeinsetsmake(0, 0, 0, 30);

注:測試時需要添加rtl本地化語言才能看到效果

1.2. 安全區域

在ios 11中新增了安全區域的概念,目的是告訴開發者在這個區域下繪制的內容的顯示才是有效的,否則會存在被遮擋的情況(特別是iphonex那帥氣的劉海)。在uiview中新增safearealayoutguide和safeareainsets來獲取屏幕的安全區域(對于frame布局時是很有用的)。如圖所示:

IOS11新特性與兼容適配

safearea示意圖

舉個例子,在一個空白的uiviewcontroller中,分別在viewdidload和viewdidappear方法中輸出view.safeareainsets觀察邊距情況,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- (void)viewdidload
{
[super viewdidload];
 
nsstring *edgestr = nsstringfromuiedgeinsets(self.view.safeareainsets);
nsstring *layoutfrmstr = nsstringfromcgrect(self.view.safearealayoutguide.layoutframe);
nslog(@"viewdidload safeareainsets = %@, layoutframe = %@", edgestr, layoutfrmstr);=
}
 
- (void)viewdidappear:(bool)animated
{
[super viewdidappear:animated];
 
nsstring *edgestr = nsstringfromuiedgeinsets(self.view.safeareainsets);
nsstring *layoutfrmstr = nsstringfromcgrect(self.view.safearealayoutguide.layoutframe);
nslog(@"viewdidappear safeareainsets = %@, layoutframe = %@", edgestr, layoutfrmstr);
}

可以看到其輸出為:

?
1
2
2017-09-19 14:45:50.246095+0800 sample[5608:1365070] viewdidload safeareainsets = {0, 0, 0, 0}, layoutframe = {{0, 0}, {375, 667}}
2017-09-19 14:45:50.257807+0800 sample[5608:1365070] viewdidappear safeareainsets = {20, 0, 0, 0}, layoutframe = {{0, 20}, {375, 603}}

可見,在視圖顯示完成的時候view的頂部邊距變為了20px,而這20px正是狀態欄的高度。同樣原理,如果你的是一個

uinavigationcontroller那在顯示的時候view.safeareainsets就會變成{64, 0, 0, 0}。注意:在該vc下所有的uiview及其子類獲取到safeareainsets的值是相同的。

如果你想準確地知道安全區域是什么時候被改變的,可以重寫uiview的safeareainsetsdidchange方法,在這個方法里面可以監聽安全區域的邊距調整的事件(如果使用的是uiviewcontroller,其也提供相應方法來實現監聽,下一章節會講述該部分內容),代碼如下:

?
1
2
3
4
- (void)safeareainsetsdidchange
{
//寫入變更安全區域后的代碼...
}

如果你不想讓safeareainsets影響你的視圖布局,則可以將insetslayoutmarginsfromsafearea設置為no,所有的視圖布局將會忽略safeareainsets這個屬性了。要注意的是,insetslayoutmarginsfromsafearea僅用于autolayout,即使該屬性為no,視圖的safeareainsets還是一樣有值,而且安全區域變更方法safeareainsetsdidchange一樣被調用。

2. uiviewcontroller變化

2.1. 廢除api

2.1.1. automaticallyadjustsscrollviewinsets方法

ios 7中使用該方法來自動調整uiscrollview的contentinset。在ios 11之后將會使用uiscrollview的

contentinsetadjustmentbehavior屬性來代替該方法。

2.1.2. toplayoutguide和bottomlayoutguide屬性

ios 7中使用這兩個屬性來指導帶有導航欄(naviagtionbar)和頁簽欄(tabbar)的視圖排版。其作用如下圖所示

IOS11新特性與兼容適配

toplayoutguide & bottomlayoutguide

在ios 11之后將使用安全區域(safe area)來代替該部分功能的實現。

2.2. 排版

2.2.1. additionalsafeareainsets屬性

ios 11加入安全區域后,對于vc則可以通過該屬性來對該區域附加一個邊距信息。如:

?
1
self.additionalsafeareainsets = uiedgeinsetsmake(30, 0, 0, 30);

注意:這里是附加邊距,意思就是在原有的safeareainsets值中增加對應的邊距值。如果原來的是{10, 0, 0, 10}, 則最后得出的邊距是{40, 0, 0, 40}。

2.2.2. systemminimumlayoutmargins和viewrespectssystemminimumlayoutmargins屬性

該屬性表示了一個系統最小的邊距信息,所有的視圖排版都應該遵循這個邊距信息的。除非將viewrespectssystemminimumlayoutmargins設置為no。

2.2.3. viewlayoutmarginsdidchange方法

根視圖的邊距變更時會觸發該方法的回調。可以通過該方法來處理當邊距改變時子視圖的布局。

2.2.4. viewsafeareainsetsdidchange方法

當視圖的安全區域發生變更時會觸發該方法的回調。可以通過該方法來處理安全區域變更時的子視圖布局。

3. uinavigationbar變化

ios 11中加入了大標題模式,其顯示效果如下所示:

IOS11新特性與兼容適配

大標題效果圖

實現該效果需要將導航欄的preferslargetitles設置為yes,如:

self.navigationcontroller.navigationbar.preferslargetitles = yes;

4. uinavigationitem變化

4.1 控制大標題的顯示

如果你想控制每個視圖的大標題是否顯示,這需要使用uinavigationitem的largetitledisplaymode屬性來控制大標題的顯示。該屬性為枚舉類型,定義如下:

?
1
2
3
4
5
6
7
8
9
typedef ns_enum(nsinteger, uinavigationitemlargetitledisplaymode)
{
/// 自動模式,會繼承前一個navigationitem所設置的模式
uinavigationitemlargetitledisplaymodeautomatic,
/// 當前 navigationitem 總是啟用大標題模式
uinavigationitemlargetitledisplaymodealways,
/// 當前 navigationitem 總是禁用大標題模式
uinavigationitemlargetitledisplaymodenever,
}

根據上面的描述,可以在vc初始化init或者awakefromnib方法中設置顯示圖標模式:

?
1
self.navigationitem.largetitledisplaymode = uinavigationitemlargetitledisplaymodealways;

4.2 控制搜索控制器

ios 11 中新增了兩個屬性searchcontroller和hidessearchbarwhenscrolling。這兩個屬性主要用于簡化vc對uisearchcontroller的集成以及視覺優化。其中searchcontroller屬性用于指定當前vc的一個搜索控制器。而hidessearchbarwhenscrolling屬性則用于控制當視圖滾動時是否隱藏搜索欄的ui,當該值為yes時,搜索欄只有在內容視圖(uiscrollview及其子類)頂部是才會顯示,在滾動過程中會隱藏起來;當該值為no時,則不受滾動影響一直顯示在導航欄中。具體的代碼實現如下:

?
1
2
3
4
5
6
7
8
- (void)awakefromnib
{
[super awakefromnib];
//設置searchcontroller到navigationitem
self.searchcontroller = [[uisearchcontroller alloc] initwithsearchresultscontroller:self];
self.navigationitem.searchcontroller = self.searchcontroller;
self.navigationitem.hidessearchbarwhenscrolling = yes;
}

IOS11新特性與兼容適配

IOS11新特性與兼容適配

搜索欄隱藏后效果

5. uiscrollview變化

之前的系統中,如果你的滾動視圖包含在一個導航控制器下,系統會自動地調整你的滾動視圖的contentinset。而ios 11新增adjustedcontentinset屬性取替之前contentinset的處理方式。這兩者之間的關系如下圖所示:

IOS11新特性與兼容適配

adjustedcontentinset & contentinset

通過一個例子來驗證這說法,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- (void)viewdidload
{
[super viewdidload];
 
nslog(@"viewdidload");
nslog(@"self.tableview.contentinset = %@", nsstringfromuiedgeinsets(self.tableview.contentinset));
nslog(@"self.tableview.adjustedcontentinset = %@", nsstringfromuiedgeinsets(self.tableview.adjustedcontentinset));
}
- (void)viewdidappear:(bool)animated
{
[super viewdidappear:animated];
 
nslog(@"viewdidappear");
nslog(@"self.tableview.contentinset = %@", nsstringfromuiedgeinsets(self.tableview.contentinset));
nslog(@"self.tableview.adjustedcontentinset = %@", nsstringfromuiedgeinsets(self.tableview.adjustedcontentinset));
}

執行后輸出下面信息:

?
1
2
3
4
5
6
2017-09-20 11:54:09.361348+0800 sample[1276:375286] viewdidload
2017-09-20 11:54:09.361432+0800 sample[1276:375286] self.tableview.contentinset = {0, 0, 0, 0}
2017-09-20 11:54:09.361462+0800 sample[1276:375286] self.tableview.adjustedcontentinset = {0, 0, 0, 0}
2017-09-20 11:54:09.420000+0800 sample[1276:375286] viewdidappear
2017-09-20 11:54:09.420378+0800 sample[1276:375286] self.tableview.contentinset = {0, 0, 0, 0}
2017-09-20 11:54:09.420554+0800 sample[1276:375286] self.tableview.adjustedcontentinset = {20, 0, 0, 0}

可見,tableview的adjustedcontentinset自動改變了,但是contentinset的值是保持不變的。注:一定要是vc的根視圖為uiscrollview或者其子類才能夠得到adjustedcontentinset的值,否則獲取到的是空值。而且非根視圖的滾動視圖就會被安全區域所裁剪,看到的樣式如下圖所示:

IOS11新特性與兼容適配

樣式效果對比

通過使用contentinsetadjustmentbehavior屬性可以控制 adjustedcontentinset的變化。該屬性為枚舉類型,其定義如下:

?
1
2
3
4
5
6
typedef ns_enum(nsinteger, uiscrollviewcontentinsetadjustmentbehavior) {
uiscrollviewcontentinsetadjustmentautomatic,
uiscrollviewcontentinsetadjustmentscrollableaxes,
uiscrollviewcontentinsetadjustmentnever,
uiscrollviewcontentinsetadjustmentalways,
}

其中uiscrollviewcontentinsetadjustmentautomatic與uiscrollviewcontentinsetadjustmentscrollableaxes一樣,scrollview會自動計算和適應頂部和底部的內邊距并且在scrollview 不可滾動時,也會設置內邊距;

uiscrollviewcontentinsetadjustmentnever表示不計算內邊距;uiscrollviewcontentinsetadjustmentalways則根據視圖的安全區域來計算內邊距。

如果需要感知adjustedcontentinset的變化,然后根據變化進行不同操作則可以通過重寫新增的adjustedcontentinsetdidchange方法或者實現uiscrollviewdelegate中的scrollviewdidchangeadjustedcontentinset方法來實現。如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
//重寫方法
- (void)adjustedcontentinsetdidchange
{
[super adjustedcontentinsetdidchange];
 
//執行操作...
}
 
//實現委托
- (void)scrollviewdidchangeadjustedcontentinset:(uiscrollview *)scrollview
{
//執行操作...
}

除了新增上述所說的邊距相關屬性外,還新增了contentlayoutguide和framelayoutguide屬性,用于描述內容布局和整體布局信息。

6. ui主線程操作日志提醒

之前的系統中如果你不小心將ui放入非主線程操作時,debug日志是沒有任何信息反饋的,導致有時候在排錯時非常困難。在新的xcode 9中,如果你處于調試狀態,將ui放入非主線程操作,如:

?
1
2
3
4
5
dispatch_async(dispatch_get_global_queue(0, 0), ^{
self.tv = [[uitableview alloc] initwithframe:self.view.bounds];
[self.view addsubview:self.tv];
nslog(@"self.tv.adjustedcontentinset = %@", nsstringfromuiedgeinsets(self.tv.adjustedcontentinset));
});

log中會出現下面提示:

?
1
2
3
4
5
6
7
8
9
10
11
12
=================================================================
main thread checker: ui api called on a background thread: -[uiview bounds]
pid: 16919, tid: 2972321, thread name: (none), queue name: com.apple.root.default-qos, qos: 21
backtrace:
4 sample    0x00000001004885dc __29-[viewcontroller viewdidload]_block_invoke + 112
5 libdispatch.dylib   0x000000010077149c _dispatch_call_block_and_release + 24
6 libdispatch.dylib   0x000000010077145c _dispatch_client_callout + 16
7 libdispatch.dylib   0x000000010077d56c _dispatch_queue_override_invoke + 980
8 libdispatch.dylib   0x0000000100782b54 _dispatch_root_queue_drain + 616
9 libdispatch.dylib   0x0000000100782880 _dispatch_worker_thread3 + 136
10 libsystem_pthread.dylib  0x000000018300b130 _pthread_wqthread + 1268
11 libsystem_pthread.dylib  0x000000018300ac30 start_wqthread + 4

從日志中了解到一個main thread checker的東西,根據蘋果官方文檔來看他是作用在appkit(osx中)、uikit還有一些相關api上的后臺線程,主要是用來監控這些框架中的接口是否在主線程中進行調用,如果沒有則發出警告日志。因此,利用這個功能可以讓我們快速地定位那些地方存在問題。

以上就是本次ios11新特性與兼容適配介紹的全部內容,如果大家還有任何問題可以在下方留言處留言討論。

延伸 · 閱讀

精彩推薦
  • IOSiOS中UILabel實現長按復制功能實例代碼

    iOS中UILabel實現長按復制功能實例代碼

    在iOS開發過程中,有時候會用到UILabel展示的內容,那么就設計到點擊UILabel復制它上面展示的內容的功能,也就是Label長按復制功能,下面這篇文章主要給大...

    devilx12792021-04-02
  • IOSiOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    這篇文章主要介紹了iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果的相關資料,需要的朋友可以參考下...

    jiangamh8882021-01-11
  • IOSiOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

    iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和

    這篇文章主要介紹了iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)的相關資料,需要的朋友可以參考下...

    CodingFire13652021-02-26
  • IOSiOS開發技巧之狀態欄字體顏色的設置方法

    iOS開發技巧之狀態欄字體顏色的設置方法

    有時候我們需要根據不同的背景修改狀態欄字體的顏色,下面這篇文章主要給大家介紹了關于iOS開發技巧之狀態欄字體顏色的設置方法,文中通過示例代碼...

    夢想家-mxj8922021-05-10
  • IOSiOS開發之視圖切換

    iOS開發之視圖切換

    在iOS開發中視圖的切換是很頻繁的,獨立的視圖應用在實際開發過程中并不常見,除非你的應用足夠簡單。在iOS開發中常用的視圖切換有三種,今天我們將...

    執著丶執念5282021-01-16
  • IOS詳解iOS中多個網絡請求的同步問題總結

    詳解iOS中多個網絡請求的同步問題總結

    這篇文章主要介紹了詳解iOS中多個網絡請求的同步問題總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    liang199111312021-03-15
  • IOSiOS實現控制屏幕常亮不變暗的方法示例

    iOS實現控制屏幕常亮不變暗的方法示例

    最近在工作中遇到了要將iOS屏幕保持常亮的需求,所以下面這篇文章主要給大家介紹了關于利用iOS如何實現控制屏幕常亮不變暗的方法,文中給出了詳細的...

    隨風13332021-04-02
  • IOSiOS中MD5加密算法的介紹和使用

    iOS中MD5加密算法的介紹和使用

    MD5加密是最常用的加密方法之一,是從一段字符串中通過相應特征生成一段32位的數字字母混合碼。對輸入信息生成唯一的128位散列值(32個字符)。這篇文...

    LYSNote5432021-02-04
主站蜘蛛池模板: 成人午夜免费观看 | 91短视频版高清在线观看免费 | 中文字幕在线观看免费视频 | 91看片王 | 亚洲经典视频 | 久草视频福利在线观看 | 蜜桃精品视频 | 日韩av电影在线免费观看 | 免费放黄网站在线播放 | 成人爱爱电影 | 亚洲骚综合 | 欧美一级黄 | 99久久久久国产精品免费 | 欧美一级片免费在线观看 | 久久人添人人爽人人爽人人片av | 日韩视频一二区 | 国产精品免费一区二区 | 亚洲午夜视频 | 精品中文字幕在线播放 | 成人在线视频免费 | 中文字幕偷拍 | 羞羞视频入口 | 久久亚洲一区二区三区成人国产 | 最新av网址在线观看 | 免费观看一级淫片 | 免费一级在线观看 | 免费网站看v片在线a | 欧美激情视频一区二区免费 | 草莓福利社区在线 | 国产一区二区在线免费观看 | 久久一级 | 有兽焉免费动画 | 欧美三级欧美成人高清www | 欧美一区二区黄 | 毛片在线免费观看完整版 | 精品免费在线视频 | 天天看夜夜爽 | 得得啪在线 | 欧美国产永久免费看片 | 毛片在哪里看 | 欧美日韩在线视频观看 |