亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

詳解iOS應用開發中autoresizing尺寸自動適應屬性的用法

2020-07-26 03:25:00
字體:
來源:轉載
供稿:網友

前言:現在已經不像以前那樣只有一個尺寸,現在最少的iPhone開發需要最少需要適配三個尺寸。因此以前我們可以使用硬坐標去設定各個控件的位置,但是現在的話已經不可以了,我們需要去做適配,也許你說可以使用兩套UI或兩套以上的UI,但那樣不高效也不符合設計。iOS有兩大自動布局利器:autoresizing 和 autolayout(autolayout是IOS6以后新增)。autoresizing是UIView的屬性,一直存在,使用也比較簡單,但是沒有autolayout那樣強大。如果你的界面比較簡單,要求的細節沒有那么高,那么你完全可以使用autoresizing去進行自動布局。以下會針對autoresizing進行討論。

零、autoresizing使用前的解釋:

UIViewAutoresizing是一個枚舉類型,默認是UIViewAutoresizingNone,也就是不做任何處理。

復制代碼 代碼如下:

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};

各屬性解釋:

201632390817501.png (731×400)

在這里說明一下,如果是經常使用Storyboard/Xib設置autoresizing,那么轉變使用代碼設置autoresizing的話,容易出現理解錯誤問題。比如說UIViewAutoresizingFlexibleTopMargin,也許會被誤認為是頂部距離不變,其實是底部距離不變。這個解決辦法也很簡單,只需要把使用代碼和使用Storyboard設置autoresizing,它們是相反的,只需要這樣去記就可以了。

autoresizing組合使用:

也就是枚舉中的值可以使用|隔開,同時擁有多個值的功能,可以針對不同的場景作不同的變化。例如:

UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin
意思是:view的寬度按照父視圖的寬度比例進行縮放,距離父視圖頂部距離不變。

其它的組合類似,我這里就不一一列舉了。

注意:

1)view的autoresizesSubviews屬性為yes時(默認為yes),autoresizing才會生效。

2)從XCODE6開始,Storyboard&Xib默認是自動布局,因此我們需要手動調整,才能使用autoresizing。

具體操作如圖(打開Storyboard文件,你就會看到下面圖的界面):

201632390848702.jpg (502×694)

下面會寫一個簡單的例子以給予你們更直觀的理解,并會在本文最后附上Demo下載地址,請繼續往下觀看噢。

Demo:

1)頂部距離父視圖距離不變

2)寬度按父視圖比例進行拉伸

3)view與父視圖的左邊距和右邊距不變

201632390909858.png (564×540)

一、使用代碼(Code)控制autoresizingMask

下面是項目用到的宏:

復制代碼 代碼如下:

#define topSpace 64
#define kMargin 20
 
#define kTopViewHeight 44
#define kTopViewWidth 300
 
#define kTextLabelWidth 200
#define kTextLabelHeight 30

沒有做適配之前的代碼:
復制代碼 代碼如下:

// 以Iphone4(320, 480)為基礎,設置各控件的位置
// 注意:必須所有控件都按照Iphone4(320, 480)為基礎初始化一次,不然按比例縮放時會發生錯誤!
UIView *topView = [[UIView alloc] initWithFrame:CGRectMake(kMargin, topSpace, kTopViewWidth, kTopViewHeight)];
CGFloat textLabelTop = (topView.frame.size.width - kTextLabelWidth) / 2;
CGFloat textLabelWidth = (topView.frame.size.height - kTextLabelHeight) / 2;
UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(textLabelTop, textLabelWidth, kTextLabelWidth, kTextLabelHeight)];
 
// 設置文字及居中
[textLabel setText:@"Garvey"];
[textLabel setTextAlignment:NSTextAlignmentCenter];
 
// 分別設置樣式
[topView setBackgroundColor:[UIColor redColor]];
[textLabel setTextColor:[UIColor whiteColor]];// 添加視圖
[topView addSubview:textLabel];
[self.view addSubview:topView];

它將會顯示:

201632390930508.jpg (244×188)

使用autoresizing進行界面適配:

補充:你可以先按其它的設備尺寸為界面上的控件初始化,因為autoresizing是會以父視圖的改變而改變。

復制代碼 代碼如下:

// 以Iphone4(320, 480)為基礎,設置各控件的位置
// 注意:必須所有控件都按照Iphone4(320, 480)為基礎初始化一次,不然按比例縮放時會發生錯誤!
UIView *topView = [[UIView alloc] initWithFrame:CGRectMake(kMargin, kTopSpace, kTopViewWidth, kTopViewHeight)];
CGFloat textLabelTop = (topView.frame.size.width - kTextLabelWidth) / 2;
CGFloat textLabelWidth = (topView.frame.size.height - kTextLabelHeight) / 2;
UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(textLabelTop, textLabelWidth, kTextLabelWidth, kTextLabelHeight)];
 
// 設置文字及居中
[textLabel setText:@"Garvey"];
[textLabel setTextAlignment:NSTextAlignmentCenter];
 
// 分別設置樣式
[topView setBackgroundColor:[UIColor redColor]];
[textLabel setTextColor:[UIColor whiteColor]];
 
// 設置文字控件的寬度按照上一級視圖(topView)的比例進行縮放
[textLabel setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
// 設置View控件的寬度按照父視圖的比例進行縮放,距離父視圖頂部、左邊距和右邊距的距離不變
[topView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin];
 
// 添加視圖
[topView addSubview:textLabel];
[self.view addSubview:topView];
 
// 注意:重新設置topView位置的代碼,必須要寫在添加視圖的后面,不然autoresizing的位置計算會出錯!
CGFloat topViewWidth = kUIScreen.size.width - kMargin * 2;
[topView setFrame:CGRectMake(kMargin, kTopSpace, topViewWidth, kTopViewHeight)];

最后顯示:

201632390950869.png (564×540)

二、在Storyboard控制autoresizingMask

autoresizingMask無論是在storyboard中實現還是用代碼實現,本質上來說就是六條線。

在storyboard中使用autoresizingMask需要將Autolayout禁用掉。

如圖:

201632391014574.png (488×124)

圖中共有六條線(上下左右到外圍的距離線和內部的兩條線)。

如果上下左右的線中的某一條選中,則表示距離父控件的邊界的距離不變。

比如圖中選中左和上的線,表示藍色view距離self.view的左邊界和上邊界的距離不變。

如果同時選中上下左右的線,那么行為會和選中上左的線是一樣的,也就是默認的行為。

如果想讓子控件尺寸跟隨父控件尺寸改變而改變,那么需要用到內部的兩條線。內部的線表示允許控件在水平和垂直方向上可拉伸。如果不選中內部的線,說明是不希望控件可拉伸的,也就是固定大小的。

也就是說,周圍的線選中表示固定距離,內部的線選中表示允許拉伸。

如果用代碼設置autoresizingMask,會發現一個view的autoresizingMask屬性是一個枚舉:

復制代碼 代碼如下:

UIViewAutoresizingNone                 = 0,
UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
UIViewAutoresizingFlexibleWidth        = 1 << 1,
UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
UIViewAutoresizingFlexibleHeight       = 1 << 4,
UIViewAutoresizingFlexibleBottomMargin = 1 << 5

除了第一個是None,剩下的六個就對應storyboard中的六條線。

注意上面

復制代碼 代碼如下:

UIViewAutoresizingFlexibleWidth
UIViewAutoresizingFlexibleHeight

這是正好和storyboard中設置autoresizingMask中內部的兩天線是一致的:可拉伸的寬度和高度。

剩下的需要注意一下:

復制代碼 代碼如下:

UIViewAutoresizingFlexibleLeftMargin
UIViewAutoresizingFlexibleRightMargin 
UIViewAutoresizingFlexibleTopMargin   
UIViewAutoresizingFlexibleBottomMargin

在storyboard中,如果選中周圍的線,表示距離固定。比如我選中了左邊的線,那么表示我想要左邊的距離固定,所以在代碼中我應該選擇UIViewAutoresizingFlexibleRightMargin,即表示右邊的距離不固定,那么則默認左邊的距離固定。

autoresizingMask的缺點是只能保證父控件和子控件間的關系,無法保證同級控件間的關系,也就是說有些需求,autoresizingMask是無法實現的。更多的精力應該放在Autolayout上。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品小视频| 大桥未久av一区二区三区| 上原亚衣av一区二区三区| 久久亚洲精品网站| 91性高湖久久久久久久久_久久99| 日韩成人在线免费观看| 国产成人综合久久| 青青草原一区二区| 日韩av不卡在线| 亚洲片在线观看| 亚洲一区二区三区四区视频| 国产亚洲人成网站在线观看| 日韩在线视频播放| 亚洲sss综合天堂久久| 欧美黄色性视频| 亚洲精品v欧美精品v日韩精品| 中文字幕亚洲欧美日韩高清| 国产亚洲欧美视频| 亚洲一区二区免费| 欧美中文字幕精品| 国产成人综合精品| 亚洲欧洲自拍偷拍| 日韩电影中文字幕在线观看| 久久色精品视频| 亚洲国产精品人人爽夜夜爽| 国产精品视频最多的网站| 亚洲精品成a人在线观看| 黑人狂躁日本妞一区二区三区| 精品久久久久久久久久| 91色在线视频| 国产九九精品视频| 国产综合在线观看视频| 日韩乱码在线视频| 欧美wwwxxxx| 精品欧美aⅴ在线网站| 欧美成aaa人片在线观看蜜臀| 欧美一级片免费在线| 国产91ⅴ在线精品免费观看| 亚洲国产精品专区久久| 上原亚衣av一区二区三区| 清纯唯美日韩制服另类| 91黑丝在线观看| 久久精品91久久久久久再现| 78色国产精品| 欧美性资源免费| 色综合天天综合网国产成人网| 国产一区二区三区18| y97精品国产97久久久久久| 狠狠躁夜夜躁人人爽天天天天97| 欧美三级xxx| 国产主播精品在线| 久久精品国产91精品亚洲| 久久久精品一区二区| 亚洲国产精品va在线看黑人动漫| 色777狠狠综合秋免鲁丝| 中文国产成人精品| 国产日韩在线观看av| 久久久久国产精品免费| 91免费高清视频| 亚洲视频欧美视频| 国产精品激情av电影在线观看| 国产91成人在在线播放| 亚洲亚裔videos黑人hd| 日韩美女写真福利在线观看| 亚洲黄色成人网| 97精品国产aⅴ7777| 日韩精品免费在线观看| 中文字幕欧美视频在线| 久久久久北条麻妃免费看| 欧美成人免费全部| 成人国产在线激情| 亚洲精品中文字幕av| 亚洲成人精品视频| 美女性感视频久久久| 亚洲白拍色综合图区| 亚洲免费视频网站| 国产精品欧美亚洲777777| 尤物九九久久国产精品的分类| 欧美在线亚洲在线| 国产精品96久久久久久| 久久久久亚洲精品成人网小说| 欧美日韩一区二区三区| 2019亚洲男人天堂| 17婷婷久久www| 亚洲护士老师的毛茸茸最新章节| 狠狠躁夜夜躁人人躁婷婷91| 色天天综合狠狠色| 国产精品久久久久7777婷婷| 欧美成年人视频网站欧美| 国产精品久久久久不卡| 一区二区三区www| 亚洲精品短视频| 亚洲国产精品资源| 日韩欧美国产骚| 欧美激情在线狂野欧美精品| 一本色道久久综合狠狠躁篇怎么玩| 成人性教育视频在线观看| 亚洲国产成人精品久久| 黄色一区二区三区| 欧美激情视频在线| 欧美成人在线影院| 国产精品欧美风情| 欧美电影免费看| 日韩中文字幕在线观看| 色樱桃影院亚洲精品影院| 91精品国产综合久久香蕉922| 国产欧美日韩高清| 欧美性xxxxx| 日韩精品亚洲视频| 日韩中文第一页| 亚洲最大在线视频| 日韩精品视频在线播放| 国产精品香蕉国产| 亚洲电影免费观看高清完整版在线| 亚洲欧洲成视频免费观看| 综合激情国产一区| 亚洲欧美在线磁力| 96精品视频在线| 色婷婷av一区二区三区久久| 国产视频一区在线| 国产精品电影观看| 国产精品无av码在线观看| 日韩高清电影免费观看完整版| 视频在线观看99| 欧美精品在线第一页| 欧美电影在线播放| 91av国产在线| 亚洲精品动漫100p| 91av在线影院| 亚洲第一av在线| 精品一区二区亚洲| 91精品国产自产在线老师啪| 8090理伦午夜在线电影| 亚洲有声小说3d| 欧美激情亚洲精品| 91精品一区二区| 亚洲欧美日韩中文视频| 日韩免费精品视频| 亚洲美女福利视频网站| 欧美另类老肥妇| 日韩在线观看免费av| 成人伊人精品色xxxx视频| 久久久久久久一区二区| 欧美国产精品日韩| 亚洲一区二区久久| 国内免费精品永久在线视频| 精品高清一区二区三区| 91精品国产综合久久香蕉| 国产精品久久婷婷六月丁香| 91精品视频大全| 午夜精品福利在线观看| 亚洲一区二区三区乱码aⅴ| 国产亚洲一区二区在线| 国产高清视频一区三区| 播播国产欧美激情| 亚洲精品一区二三区不卡| 国产欧美最新羞羞视频在线观看| 欧美巨猛xxxx猛交黑人97人| 亚洲精品电影在线| 国产精品情侣自拍| 91亚洲一区精品| 欧美成人精品三级在线观看| 国产欧亚日韩视频| 一区二区三区视频免费|