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

首頁 > 學院 > 開發設計 > 正文

IOS自動布局-UIStackPanel和UIGridPanel(五)

2019-11-14 19:57:43
字體:
來源:轉載
供稿:網友

試想這樣的一個需求場合,一個button靠右顯示,并且距離superView的頂部和右邊間距分別為10和5。如下圖所示:

要實現這樣的需求,如果不用自動布局技術,那么我們能想到的就是老老實實的使用絕對布局的坐標計算來實現了,假如這個button寬高都是100,父視圖的寬是300,那么這個button的坐標就是:(300-100-5,10)。但要是父視圖的寬度變了,我們還得重新計算一遍。頗為麻煩。

幸好我們有自動布局技術。要實現這樣的需求還是相對比較簡單的。

既然我們要實現這樣的需求,而且這個需求其實也是具有普遍性的,那么我們直接封裝下好了。我們給UIView添加兩個擴展屬性:horizontalAlignment和verticalAlignment。兩個屬性都是枚舉。

typedef NS_ENUM(NSInteger, UIViewVerticalAlignment) {    UIViewVerticalAlignmentFill    = 0,    UIViewVerticalAlignmentCenter  = 1,    UIViewVerticalAlignmentTop     = 2,    UIViewVerticalAlignmentBottom  = 3    };typedef NS_ENUM(NSInteger, UIViewHorizontalAlignment) {    UIViewHorizontalAlignmentFill    = 0,    UIViewHorizontalAlignmentCenter  = 1,    UIViewHorizontalAlignmentLeft    = 2,    UIViewHorizontalAlignmentRight   = 3};@PRoperty (nonatomic,assign)UIViewHorizontalAlignment horizontalAlignment;@property (nonatomic,assign)UIViewVerticalAlignment verticalAlignment;

實現的思路如下:

我下面以水平??颗e例,對于水平??坑兴姆N情況,首先就是不??客耆奶畛?,也就是我們把該subview的寬度跟superview的寬度綁定到一起。第二種情況是左邊???,依次還有居中??亢陀疫呁?俊?/p>

對于非填充??浚趯挾确矫婵隙ú荒苤苯咏壎ǖ絪uperview的寬度了,只能使用UIView的擴展屬性size的寬度了。

現在以上述場景的實現為例,就是水平方向右邊??俊D敲次覀冎灰裺ubview的NSLayoutAttributeRight跟superview的NSLayoutAttributeRight對齊就好了。代碼如下:

[self.superview addConstraint:[NSLayoutConstraint constraintWithItem:self                                                             attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.superview attribute:NSLayoutAttributeRight multiplier:1.0f constant:-margin.right]];

對于左邊??亢途又型?繜o非就是對齊的屬性不一樣。對于垂直停靠來說也是這樣。

完整的??看a如下:

UIEdgeInsets margin=self.margin;    switch (self.verticalAlignment) {        case UIViewVerticalAlignmentFill:        {            NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-top-[view]-bottom-|" options:0 metrics:@{ @"top" : @(margin.top),@"bottom":@(margin.bottom)} views:@{ @"view" : self}];            [self.superview addConstraints:constraints];        }            break;        case UIViewVerticalAlignmentBottom:        {            [self.superview addConstraint:[NSLayoutConstraint constraintWithItem:self                                                             attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.superview attribute:NSLayoutAttributeBottom multiplier:1.0f constant:-margin.bottom]];        }            break;        case UIViewVerticalAlignmentCenter:        {            [self.superview addConstraint:[NSLayoutConstraint constraintWithItem:self                                                             attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.superview attribute:NSLayoutAttributeCenterY multiplier:1.0f constant:0]];        }            break;        case UIViewVerticalAlignmentTop:        {            [self.superview addConstraint:[NSLayoutConstraint constraintWithItem:self                                                             attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.superview attribute:NSLayoutAttributeTop multiplier:1.0f constant:margin.top]];        }            break;        default:            break;    }    switch (self.horizontalAlignment) {        case UIViewHorizontalAlignmentFill:{            NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-left-[view]-right-|" options:0 metrics:@{ @"left" : @(margin.left),@"right":@(margin.right)} views:@{ @"view" : self}];//添加寬度的約束            [self.superview addConstraints:constraints];        }            break;        case UIViewHorizontalAlignmentCenter:{            [self.superview addConstraint:[NSLayoutConstraint constraintWithItem:self                                                             attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.superview attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0]];        }            break;        case UIViewHorizontalAlignmentLeft:{            [self.superview addConstraint:[NSLayoutConstraint constraintWithItem:self                                                             attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.superview attribute:NSLayoutAttributeLeft multiplier:1.0f constant:margin.left]];        }            break;        case UIViewHorizontalAlignmentRight:{            [self.superview addConstraint:[NSLayoutConstraint constraintWithItem:self                                                             attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.superview attribute:NSLayoutAttributeRight multiplier:1.0f constant:-margin.right]];        }            break;        default:            break;    }

對于???,我們前面寫的UIStackPanel和UIGridView勢必也要支持的。因此我也修改了下原來的代碼。

 

然后對于圖中 的那個button的代碼就是如下:

   UIButton *btn=[[UIButton alloc] initWithSize:CGSizeMake(100, 100)];    [btn setBackgroundColor:[UIColor blueColor]];    btn.isBindSizeToSuperView=YES;    [btn setTitle:@"button1" forState:UIControlStateNormal];    btn.horizontalAlignment=UIViewHorizontalAlignmentRight;    btn.verticalAlignment=UIViewVerticalAlignmentTop;    btn.margin=UIEdgeInsetsMake(10, 0, 0, 5);    [self.view addSubview:btn];

 

 至此這個系列的博客完結!

完整的源碼請點擊下載。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区二区久久久久久| 日韩国产高清视频在线| 日韩精品免费看| 国产精品96久久久久久| 尤物九九久久国产精品的特点| 国产经典一区二区| 国产精品中文字幕在线| 国产精品偷伦视频免费观看国产| 成人福利在线视频| 亚洲国产一区二区三区四区| 国产va免费精品高清在线| 欧美日韩国产影院| 亚洲自拍欧美色图| 精品自在线视频| 午夜精品在线观看| 国产精品一区二区久久久久| 欧洲美女免费图片一区| 欧美黑人一区二区三区| 国产午夜精品视频免费不卡69堂| 黑人精品xxx一区一二区| 欧美日韩裸体免费视频| 亚洲乱亚洲乱妇无码| 日韩精品免费一线在线观看| 精品久久久久久久久久久久久久| 欧美中文字幕在线视频| 97久久伊人激情网| 中文字幕日韩欧美| 国产一区二区在线播放| 91av视频在线| 日韩美女免费线视频| 亚洲欧美日韩精品久久| 久久久之久亚州精品露出| 国产精品久久久久久久av大片| 国产在线观看一区二区三区| 国产成人精品免高潮在线观看| 久久精品夜夜夜夜夜久久| 精品一区二区电影| 高清一区二区三区四区五区| 国产乱人伦真实精品视频| 国产精品爽黄69天堂a| 精品视频在线播放色网色视频| 一区二区三区动漫| 精品视频在线播放| 在线视频日韩精品| 欧美理论电影在线观看| 精品国产一区av| 日韩综合中文字幕| 亚洲成人精品视频在线观看| 欧美最猛性xxxxx免费| 国产亚洲在线播放| 国产精品久久综合av爱欲tv| 狠狠色狠狠色综合日日五| 国产精品视频网| 最近2019中文免费高清视频观看www99| 在线播放日韩欧美| 狠狠久久亚洲欧美专区| 国产婷婷成人久久av免费高清| 亚洲色图狂野欧美| 国产成人精品日本亚洲专区61| 在线观看免费高清视频97| 欧美视频一区二区三区…| 成人精品在线视频| 欧美精品激情在线| 国产三级精品网站| 欧美一区亚洲一区| 自拍偷拍亚洲在线| 国产一区二区黑人欧美xxxx| 欧美xxxx做受欧美| 欧美午夜片在线免费观看| 久久久久久久久中文字幕| 久久精品99国产精品酒店日本| 久久久中精品2020中文| 成人av.网址在线网站| 久久激情五月丁香伊人| 亚洲免费影视第一页| 中国日韩欧美久久久久久久久| 亚洲一区二区三区视频| 永久免费精品影视网站| 日韩中文在线中文网三级| 精品自在线视频| 国产精品视频白浆免费视频| 国产一区二区三区久久精品| 欧美丰满少妇xxxxx做受| 中文字幕成人精品久久不卡| 欧美亚洲另类视频| 最近2019年手机中文字幕| 欧美日韩国产区| 亚洲xxxxx| 成人性生交大片免费看小说| 欧美另类极品videosbest最新版本| 精品高清美女精品国产区| 欧美专区第一页| 欧美大片免费观看| 欧美黑人狂野猛交老妇| 亚洲精品720p| 成人免费大片黄在线播放| 91国内产香蕉| 国产免费成人av| 国a精品视频大全| 日韩欧美极品在线观看| 亚洲精品mp4| 97久久久久久| 欧美日韩精品中文字幕| 91精品国产综合久久久久久蜜臀| 97国产成人精品视频| 日韩精品免费在线视频| 韩国三级日本三级少妇99| 成人女保姆的销魂服务| 国产精品久久久久久亚洲影视| 中文字幕av一区二区| 中文字幕一区电影| yw.139尤物在线精品视频| 国产亚洲精品久久久优势| 国产精品久久久久久久久久免费| 成人国产在线激情| 777午夜精品福利在线观看| 欧美电影电视剧在线观看| 亚洲老头同性xxxxx| 91国内产香蕉| 国产精品久久久久久久久| 久久久久国色av免费观看性色| 操日韩av在线电影| 91久久久久久久| 欧美黄色免费网站| 久久久久中文字幕2018| 国产一区二区黄| 欧美亚州一区二区三区| 成人做爽爽免费视频| 国产欧美精品一区二区三区介绍| 亚洲国产天堂网精品网站| 色偷偷噜噜噜亚洲男人| 成人免费网站在线看| 久久91亚洲精品中文字幕| 最近中文字幕mv在线一区二区三区四区| 亚洲精品久久久久国产| 亚洲xxxxx性| 亚洲剧情一区二区| 成人黄色在线免费| 北条麻妃在线一区二区| 久久久国产成人精品| 国产原创欧美精品| 精品亚洲永久免费精品| 日韩精品有码在线观看| 日韩av一区二区在线观看| 精品日本美女福利在线观看| 色婷婷av一区二区三区久久| 在线播放国产精品| 亚洲在线观看视频网站| 国产精品都在这里| 亚洲美女av网站| 亚洲aa中文字幕| 欧美亚洲成人免费| xxxxx成人.com| 欧美韩国理论所午夜片917电影| 国产亚洲在线播放| 久久精品青青大伊人av| 欧美大肥婆大肥bbbbb| 日韩在线免费av| 国产欧美一区二区三区四区| 日韩电影中文字幕在线| 欧美激情精品久久久久久| 国产精品欧美日韩久久| 97精品欧美一区二区三区| 国产精品视频永久免费播放|