日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS8开发~UI布局(三)深入理解autolayout

發布時間:2024/9/30 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS8开发~UI布局(三)深入理解autolayout 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、概要

通過對iOS8界面布局的學習和總結,發現autolayout才是主角,autolayout是iOS6引入的新特性,當時還粗淺的學習了下,可是沒有真正應用到項目中。隨著iOS設備尺寸逐漸碎片化,純粹的hard code方式UI布局將會走向死角,而autoresizing方式也有其局限性,所以無論如何autolayout都將成為UI布局的重要方式。

前兩篇以發燒友心態對iOS8界面布局的主要元素size class和autolayout進行了探索,發現要完全掌握autolayout需要大量的時間去實踐總結。所以深入思考autolayout是很有必要的。你可能有和我同樣的疑問,如下:

1、以后一律使用autolayout嗎?除了在storyboard中使用autolayout,代碼方式autolayout如何使用?

2、好像忽略了一個重要問題,就是view動畫在autolayout如何實現?

3、autolayout有沒有局限性和解決不了的問題?兼容性怎么樣?效率怎么樣?

4、……

二、研究開始

1、直接說以后都應該使用storyboard+autolayout感覺是不負責的說法,讀了好多網絡的帖子,最后總結如下情況使用autolayout會有幫助:

a 當需要展示的內容很多并且尺寸不固定;

b 程序需支持屏幕旋轉(主要是iPad程序,iPhone程序橫屏的場景有點非主流);

c 程序通用于iPhone和iPad;


但storyboard中使用autolayout有利有弊,好處當然是可視化,實現簡單功能很節省時間,但也有弊端,例如不小心移動一個控件就會讓弄亂那些約束。拋開storyboard而使用autolayout,就需要代碼定義約束了,而且代碼量也不是很大。當app中一些view的出現時根據網絡數據來決定的時候,代碼方式可能更合適。

先看一個簡單的Demo:

例子1:新建一個Single View Application template項目Demo4,在rootView上添加一個綠顏色的view,使新添加的view四個邊距離superView四邊20點寬

效果如圖:


使用storyboard來實現這個效果很簡單,選中綠色view,然后添加4個相對于superview的邊界約束,約束的數值設置為20,然后Update Frame就可以了,因為不區分iOS設備,所以size class可以設置為默認的wAny hAny。Demo下載

接下來使用代碼來實現UI布局,目前有3種方法可以使用:(1)最基本的約束實現方式;(2)特殊格式化語言的約束實現方式;(3)第三方UIView-AutoLayout

(1)最基本的約束實現方式

[objc]?view plaincopy
  • <span?style="font-size:12px;">-?(void)viewDidLoad?{??
  • ????[super?viewDidLoad];??
  • ????//?Do?any?additional?setup?after?loading?the?view,?typically?from?a?nib.??
  • ????self.view.translatesAutoresizingMaskIntoConstraints?=NO;??
  • ??????
  • ????UIView?*newView?=?[UIView?new];??
  • ????newView.backgroundColor?=?[UIColor?greenColor];??
  • ????[self.view?addSubview:newView];??
  • ??????
  • ????newView.translatesAutoresizingMaskIntoConstraints?=NO;??
  • ??????
  • ????NSLayoutConstraint?*constraint?=?nil;??
  • ??????
  • ????constraint?=?[NSLayoutConstraint?constraintWithItem:newView??
  • ??????????????????????????????????????????????attribute:NSLayoutAttributeLeading??
  • ??????????????????????????????????????????????relatedBy:NSLayoutRelationEqual??
  • ?????????????????????????????????????????????????toItem:self.view??
  • ??????????????????????????????????????????????attribute:NSLayoutAttributeLeading??
  • ?????????????????????????????????????????????multiplier:1.0f??
  • ???????????????????????????????????????????????constant:20];??
  • ????[self.view?addConstraint:constraint];??
  • ??????
  • ????constraint?=?[NSLayoutConstraint?constraintWithItem:newView??
  • ??????????????????????????????????????????????attribute:NSLayoutAttributeTrailing??
  • ??????????????????????????????????????????????relatedBy:NSLayoutRelationEqual??
  • ?????????????????????????????????????????????????toItem:self.view??
  • ??????????????????????????????????????????????attribute:NSLayoutAttributeTrailing??
  • ?????????????????????????????????????????????multiplier:1.0f??
  • ???????????????????????????????????????????????constant:-20];??
  • ????[self.view?addConstraint:constraint];??
  • ??????
  • ????constraint?=?[NSLayoutConstraint?constraintWithItem:newView??
  • ??????????????????????????????????????????????attribute:NSLayoutAttributeTop??
  • ??????????????????????????????????????????????relatedBy:NSLayoutRelationEqual??
  • ?????????????????????????????????????????????????toItem:self.view??
  • ??????????????????????????????????????????????attribute:NSLayoutAttributeTop??
  • ?????????????????????????????????????????????multiplier:1.0f??
  • ???????????????????????????????????????????????constant:20];??
  • ????[self.view?addConstraint:constraint];??
  • ??????
  • ????constraint?=?[NSLayoutConstraint?constraintWithItem:newView??
  • ??????????????????????????????????????????????attribute:NSLayoutAttributeBottom??
  • ??????????????????????????????????????????????relatedBy:NSLayoutRelationEqual??
  • ?????????????????????????????????????????????????toItem:self.view??
  • ??????????????????????????????????????????????attribute:NSLayoutAttributeBottom??
  • ?????????????????????????????????????????????multiplier:1.0f??
  • ???????????????????????????????????????????????constant:-20];??
  • ????[self.view?addConstraint:constraint];??
  • ??????
  • }</span>??

  • (2)特殊格式化語言的約束實現方式

    [objc]?view plaincopy
  • <span?style="font-size:12px;">-?(void)viewDidLoad?{??
  • ????[super?viewDidLoad];??
  • ????self.view.translatesAutoresizingMaskIntoConstraints?=NO;??
  • ??????
  • ????UIView?*newView?=?[UIView?new];??
  • ????newView.backgroundColor?=?[UIColor?greenColor];??
  • ????[self.view?addSubview:newView];??
  • ????newView.translatesAutoresizingMaskIntoConstraints?=NO;??
  • ??????
  • ????NSMutableArray?*constraintArray?=?[NSMutableArray?array];??
  • ??????
  • ????[constraintArray?addObjectsFromArray:[NSLayoutConstraint?constraintsWithVisualFormat:@"H:|-20-[newView]-20-|"??
  • ?????????????????????????????????????????????????????????????????????????????????options:0??
  • ?????????????????????????????????????????????????????????????????????????????????metrics:nil??
  • ???????????????????????????????????????????????????????????????????????????????????views:NSDictionaryOfVariableBindings(newView,?self.view)]];??
  • ????[constraintArray?addObjectsFromArray:[NSLayoutConstraint?constraintsWithVisualFormat:@"V:|-20-[newView]-20-|"??
  • ?????????????????????????????????????????????????????????????????????????????????options:0??
  • ?????????????????????????????????????????????????????????????????????????????????metrics:nil??
  • ???????????????????????????????????????????????????????????????????????????????????views:NSDictionaryOfVariableBindings(newView,?self.view)]];??
  • ????[self.view?addConstraints:constraintArray];??
  • }</span>??

  • (3)第三方UIView-AutoLayout

    [objc]?view plaincopy
  • <span?style="font-size:12px;">-?(void)viewDidLoad?{??
  • ????[super?viewDidLoad];??
  • ????self.view.translatesAutoresizingMaskIntoConstraints?=NO;??
  • ??????
  • ????UIView?*newView?=?[UIView?new];??
  • ????newView.backgroundColor?=?[UIColor?greenColor];??
  • ????[self.view?addSubview:newView];??
  • ????newView.translatesAutoresizingMaskIntoConstraints?=NO;??
  • ??????
  • ????[newView?autoPinEdgeToSuperviewEdge:ALEdgeLeading?withInset:20.0f];??
  • ????[newView?autoPinEdgeToSuperviewEdge:ALEdgeTrailing?withInset:20.0f];??
  • ????[newView?autoPinEdgeToSuperviewEdge:ALEdgeTop?withInset:20.0f];??
  • ????[newView?autoPinEdgeToSuperviewEdge:ALEdgeBottom?withInset:20.0f];??
  • }</span>??

  • 以上3種方式都實現了我們想要的效果,看來代碼實現autolayout也不是那么復雜!


    例子2:通過上邊例子我們實現一個簡單的UI布局,下面來一個稍微復雜點的,把上一篇中提到3個view布局的那個例子用代碼布局實現一下,但難度有所增加,當size class切換的時候,頁面布局發生相應的改變,效果如圖:

    ? ? ? ? ? ??

    首先初始化3個View:

    [objc]?view plaincopy
  • <span?style="font-size:12px;">-?(UIView?*)?alView?{??
  • ????UIView?*newView?=?[UIView?new];??
  • ????newView.translatesAutoresizingMaskIntoConstraints?=NO;??
  • ??????
  • ????return?newView;??
  • }??
  • UIView?*greenView?=?[self?alView];??
  • greenView.backgroundColor?=?[UIColor?greenColor];??
  • [self.view?addSubview:greenView];??
  • UIView?*yellowView?=?[self?alView];??
  • yellowView.backgroundColor?=?[UIColor?yellowColor];??
  • [self.view?addSubview:yellowView];??
  • UIView?*blueView?=?[self?alView];??
  • blueView.backgroundColor?=?[UIColor?blueColor];??
  • [self.view?addSubview:blueView];</span>??

  • 接下來適配豎屏的約束:

    [objc]?view plaincopy
  • <span?style="font-size:12px;">-?(NSMutableArray?*)?portraitConstraints:(UIView?*)greenView?:(UIView?*)yellowView?:(UIView?*)blueView??
  • {??
  • ????NSMutableArray?*constraintArray?=?[NSMutableArray?array];??
  • ??????
  • ????[constraintArray?addObjectsFromArray:[NSLayoutConstraint??
  • ??????????????????????????????????????????constraintsWithVisualFormat:@"H:|-20-[greenView]-20-[yellowView(==greenView)]-20-|"?options:0?metrics:nil??
  • ??????????????????????????????????????????views:NSDictionaryOfVariableBindings(greenView,?yellowView)]];??
  • ????[constraintArray?addObjectsFromArray:[NSLayoutConstraint??
  • ??????????????????????????????????????????constraintsWithVisualFormat:@"V:|-20-[greenView]-20-[blueView(==greenView)]-20-|"?options:0?metrics:nil??
  • ??????????????????????????????????????????views:NSDictionaryOfVariableBindings(greenView,?blueView)]];??
  • ??????
  • ????[constraintArray?addObjectsFromArray:[NSLayoutConstraint??
  • ??????????????????????????????????????????constraintsWithVisualFormat:@"V:|-20-[yellowView]-20-[blueView(==yellowView)]-20-|"?options:0?metrics:nil??
  • ??????????????????????????????????????????views:NSDictionaryOfVariableBindings(yellowView,?blueView)]];??
  • ??????
  • ????[constraintArray?addObjectsFromArray:[NSLayoutConstraint??
  • ??????????????????????????????????????????constraintsWithVisualFormat:@"H:|-20-[blueView]-20-|"?options:0?metrics:nil??
  • ??????????????????????????????????????????views:NSDictionaryOfVariableBindings(blueView)]];??
  • ??????
  • ????return?constraintArray;??
  • }</span>??

  • 然后橫屏的約束:

    [objc]?view plaincopy
  • <span?style="font-size:12px;">-?(NSMutableArray?*)?landscapeConstraints:(UIView?*)greenView?:(UIView?*)yellowView?:(UIView?*)blueView??
  • {??
  • ????NSMutableArray?*constraintArray?=?[NSMutableArray?array];??
  • ??????
  • ????[constraintArray?addObjectsFromArray:[NSLayoutConstraint??
  • ??????????????????????????????????????????constraintsWithVisualFormat:@"H:|-20-[greenView]-20-[yellowView(==greenView)]-20-|"?options:0?metrics:nil??
  • ??????????????????????????????????????????views:NSDictionaryOfVariableBindings(greenView,?yellowView)]];??
  • ??????
  • ????[constraintArray?addObjectsFromArray:[NSLayoutConstraint??
  • ??????????????????????????????????????????constraintsWithVisualFormat:@"V:|-20-[blueView]-20-[greenView(==blueView)]-20-|"?options:0?metrics:nil??
  • ??????????????????????????????????????????views:NSDictionaryOfVariableBindings(greenView,?blueView)]];??
  • ??????
  • ????[constraintArray?addObjectsFromArray:[NSLayoutConstraint??
  • ??????????????????????????????????????????constraintsWithVisualFormat:@"V:|-20-[blueView]-20-[yellowView(==blueView)]-20-|"?options:0?metrics:nil??
  • ??????????????????????????????????????????views:NSDictionaryOfVariableBindings(yellowView,?blueView)]];??
  • ??????
  • ????[constraintArray?addObjectsFromArray:[NSLayoutConstraint??
  • ??????????????????????????????????????????constraintsWithVisualFormat:@"H:|-20-[blueView]-20-|"?options:0?metrics:nil??
  • ??????????????????????????????????????????views:NSDictionaryOfVariableBindings(blueView)]];??
  • ??????
  • ????return?constraintArray;??
  • }</span>??

  • 最后還要處理屏幕旋轉:

    [objc]?view plaincopy
  • <span?style="font-size:12px;">-?(void)willTransitionToTraitCollection:(UITraitCollection?*)newCollection??
  • ??????????????withTransitionCoordinator:(id?<UIViewControllerTransitionCoordinator>)coordinator??
  • {??
  • ????[super?willTransitionToTraitCollection:newCollection?withTransitionCoordinator:coordinator];??
  • ??????
  • ????[coordinator?animateAlongsideTransition:^(id?<UIViewControllerTransitionCoordinatorContext>?context)?{??
  • ????????if?(newCollection.verticalSizeClass?==?UIUserInterfaceSizeClassCompact)?{??
  • ????????????NSLog(@"%s----%d",?__FUNCTION__,?__LINE__);??
  • ????????????[self.view?removeConstraints:self.view.constraints];??
  • ????????????[self.view?addConstraints:[self?landscapeConstraints:self.greenView_?:self.yellowView_?:self.blueView_]];??
  • ????????}?else?{??
  • ????????????NSLog(@"%s----%d",?__FUNCTION__,?__LINE__);??
  • ????????????[self.view?removeConstraints:self.view.constraints];??
  • ????????????[self.view?addConstraints:[self?portraitConstraints:self.greenView_?:self.yellowView_?:self.blueView_]];??
  • ????????}??
  • ????????[self.view?setNeedsLayout];??
  • ????}?completion:nil];??
  • }</span>??

  • 這樣就實現了我們預期的效果,總結下來,auotlayout就是給view添加足夠的約束,讓view系統可以根據約束來計算出一個view的frame。動手練習一下吧!


    2、view動畫在autolayout實現

    當布局發生改變時,相當于對子view進行重新布局,而子view重新布局調用?layoutIfNeeded,所以動畫可以這樣實現:

    [objc]?view plaincopy
  • <span?style="font-size:12px;">-?(void)animateConstraints??
  • {??
  • ????[UIView?animateWithDuration:0.5?animations:^{??
  • ????????[self.view?layoutIfNeeded];??
  • ????}];??
  • }</span>??

  • Github上已經有Demo了!


    3、autolayout有沒有局限性和解決不了的問題?兼容性怎么樣?效率怎么樣?

    autolayout對view transforms支持的不好,這里有帖子詳細描述了這個問題。

    至于兼容性,只從iOS6就已經提出了autolayout的概念,現在iOS5系統不是很多了,甚至iOS6系統都已經升級為iOS7,未來一段時間大部分用戶應該是使用iOS7和iOS8系統,所以兼容性問題不會太大,但size class是iOS8才有的概念,所以還有有一定的適配工作量。

    效率話題這里有提到,有時間再細研究。


    結束語:時間和體力總是有限的,標題是autolayout詳解,可想達到詳解還需要更多的時間去實踐和總結,還有一些細節沒有體現出來:

    例如:

    [objc]?view plaincopy
  • <span?style="font-size:12px;">[NSLayoutConstraint?constraintsWithVisualFormat:@"H:|-20-[newView]-20-|"options:0?metrics:nil?views:NSDictionaryOfVariableBindings(newView,?self.view)]</span>??
  • 1、這其中各個參數的含義,另外約束還有個優先級的概念

    2、@"H:|-20-[newView]-20-|" 這種可視化布局字符串的含義等等,有空再補充了!

    本篇內容所有Demo

    歡迎指出錯誤,不勝感激。

    總結

    以上是生活随笔為你收集整理的iOS8开发~UI布局(三)深入理解autolayout的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日韩免费在线观看 | 美女交配| 国产美女自拍视频 | 成人a在线 | 91桃色在线 | av大西瓜| 91视频免费看 | 欧美日韩一区二区三区不卡视频 | 国产又大又黑又粗免费视频 | 免费av不卡在线观看 | 99热综合| 午夜九九 | 日本老太婆做爰视频 | 久久久精品视频在线 | 亚洲精品专区 | 久久精品国产99精品国产亚洲性色 | 特级丰满少妇一级aaa爱毛片 | 日本乱论视频 | 亚洲av永久无码国产精品久久 | av网站在线免费观看 | 国产精品三级视频 | 男同精品 | 成人中文字幕+乱码+中文字幕 | 欧美乱欲视频 | 青青青手机视频 | 午夜做爰xxxⅹ性高湖视频美国 | 亚洲免费一二三区 | 欧美人一级淫片a免费播放 西方av在线 | 扒开伸进免费视频 | 热久久中文 | 婷婷射丁香 | 一区在线不卡 | 久久久久久亚洲精品 | 成人黄色免费在线观看 | 九九热这里都是精品 | 亚洲欧美影院 | 黄色av毛片 | 亚洲大胆人体 | 日韩不卡在线 | 亚洲aaa级 | 色久av | 在线免费视频观看 | 白丝动漫美女 | 亚洲精品久久久蜜桃 | 国产大片一区二区 | 色婷婷欧美 | 红桃视频隐藏入口 | 日韩精品国产一区 | jizz视频在线观看 | 91在线免费视频 | 婷婷五月花 | 中文精品在线 | 国产一区二区在线电影 | 日韩免费精品视频 | 天天操夜夜操夜夜操 | 日韩二区视频 | 欧美高清成人 | 国产综合自拍 | 亚洲一区二区三区四区在线 | 超碰操 | 网站毛片 | a免费视频 | 日韩毛片 | 亚洲中文字幕97久久精品少妇 | 亚洲一级二级三级 | 涩涩视频在线观看 | 亚洲欧洲国产视频 | 免费看av大片 | 九九热国产精品视频 | 9久久精品| 大黑人交交护士xxxxhd | 免费成人结看片 | 国产精品2区 | 日日狠狠 | 国产精品精品久久久 | 国产精品综合视频 | 秋霞毛片少妇激情免费 | 国产午夜麻豆影院在线观看 | а天堂中文在线官网 | 国产成a人亚洲精v品在线观看 | 欧美日韩在线不卡 | 欧美日韩成人一区二区 | 尤物视频在线免费观看 | 国产精品久久久精品三级 | 欧美草逼视频 | 欧美精品久久久久 | 日本成人三级 | 91久久久久久 | 麻豆一区二区三区四区 | 久久99久久99精品免观看软件 | 日本少妇激三级做爰在线 | 伊人久久青青 | 日本护士体内she精2xxx | 亚洲免费av网址 | 五月婷婷综合色 | 成人午夜视频精品一区 | 亚洲va久久久噜噜噜久久天堂 | 国产suv精品一区二区60 | 免费日韩 |