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

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

Layout--iOS

2019-11-14 17:52:48
字體:
來源:轉載
供稿:網友

// 系統的約束代碼

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    UIView *superView = self.view;

    

    UIView *viewDemo = [[UIView alloc] init];

    viewDemo.translatesAutoresizingMaskIntoConstraints = NO;

    viewDemo.backgroundColor = [UIColor orangeColor];

    [superView addSubview:viewDemo];

    

    UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);

    [superView addConstraints:@[

           // viewDemo頂部距離父視圖superView頂部距離為padding.top(即為:10),

                               [NSLayoutConstraint constraintWithItem:viewDemo attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeTop multiplier:1 constant:padding.top],

                               [NSLayoutConstraint constraintWithItem:viewDemo attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeLeft multiplier:1 constant:padding.left],

                               [NSLayoutConstraint constraintWithItem:viewDemo attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeRight multiplier:1 constant:-padding.right],

                               [NSLayoutConstraint constraintWithItem:viewDemo attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeBottom multiplier:1 constant:-padding.bottom]

                               ]];

}

// 注:若是把右邊約束去掉,改為如下語句

// [NSLayoutConstraint constraintWithItem:viewDemo attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:superView attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0]

// 則viewDemo的寬度變為superView的0.5倍?。?/span>

//***************************************************

// VFL語言

  UIView *viewLeft = [[UIView alloc] init];

    viewLeft.translatesAutoresizingMaskIntoConstraints = NO;

    viewLeft.backgroundColor = [UIColor orangeColor];

    [self.view addSubview:viewLeft];

    

    UIView *viewRight = [[UIView alloc] init];

    viewRight.translatesAutoresizingMaskIntoConstraints = NO;

    viewRight.backgroundColor = [UIColor redColor];

    [self.view addSubview:viewRight];

    // horizontal:水平方向距左邊10,距右邊10

    //簡單說來,NSDictionaryOfVariableBindings(scrollView)就等于@{@”scrollView”: scrollView}

    NSDictionary *constraintDict = NSDictionaryOfVariableBindings(viewLeft,viewRight);

    NSArray *hConstraintArrayLeft = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(10)-[viewLeft]-(10)-|" options:0 metrics:nil views:constraintDict];

    // vertical 垂直方向距頂部30,控件高度100

    NSArray *vConstraintArrayLeft = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(30)-[viewLeft(100)]" options:0 metrics:nil views:constraintDict];

    // 添加到父視圖上

    [self.view addConstraints:hConstraintArrayLeft];

    [self.view addConstraints:vConstraintArrayLeft];

    

    NSArray *hConstraintArrayRight = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(10)-[viewRight]-(10)-|" options:0 metrics:nil views:constraintDict];

    // viewRightviewLeft的垂直距離為50

    NSArray *vConstraintArrayRight = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[viewLeft]-(50)-[viewRight(200)]" options:0 metrics:nil views:constraintDict];

    [self.view addConstraints:hConstraintArrayRight];

    [self.view addConstraints:vConstraintArrayRight];

//***************************************************

// 三方庫:Masonry

// 居中

// 快速定義一個weakSelf,用于block里面,防止循環引用

#define WS(weakSelf)  __weak __typeof(&*self)weakSelf = self

    WS(ws);

    

    UIView *sv = [UIView new];

    

    sv.backgroundColor = [UIColor orangeColor];

    // 在做autoLayout之前 一定要先將view添加到superView 否則會報錯

    [self.view addSubview:sv];

    [sv mas_makeConstraints:^(MASConstraintMaker *make) {

        // 居中

        make.center.equalTo(ws.view);

        // 設置size

        make.size.mas_equalTo(CGSizeMake(300, 300));

    }];

 

3. [初級] 讓兩個高度為150的view垂直居中且等寬且等間隔排列 間隔為10(自動計算其寬度)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int padding1 = 10;
[sv2 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.centerY.mas_equalTo(sv.mas_centerY);
    make.left.equalTo(sv.mas_left).with.offset(padding1);
    make.right.equalTo(sv3.mas_left).with.offset(-padding1);
    make.height.mas_equalTo(@150);
    make.width.equalTo(sv3);
}];
[sv3 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.centerY.mas_equalTo(sv.mas_centerY);
    make.left.equalTo(sv2.mas_right).with.offset(padding1);
    make.right.equalTo(sv.mas_right).with.offset(-padding1);
    make.height.mas_equalTo(@150);
    make.width.equalTo(sv2);
}];

代碼效果

06.PNG

這里我們在兩個子view之間互相設置的約束 可以看到他們的寬度在約束下自動的被計算出來了

4. [中級] 在UIScrollView順序排列一些view并自動計算contentSize

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
UIScrollView *scrollView = [UIScrollView new];
scrollView.backgroundColor = [UIColor whiteColor];
[sv addSubview:scrollView];
[scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.edges.equalTo(sv).with.insets(UIEdgeInsetsMake(5,5,5,5));
}];
UIView *container = [UIView new];
[scrollView addSubview:container];
[container mas_makeConstraints:^(MASConstraintMaker *make) {
    make.edges.equalTo(scrollView);
    make.width.equalTo(scrollView);
}];
int count = 10;
UIView *lastView = nil;
for ( int i = 1 ; i <= count ; ++i )
{
    UIView *subv = [UIView new];
    [container addSubview:subv];
    subv.backgroundColor = [UIColor colorWithHue:( arc4random() % 256 / 256.0 )
                                      saturation:( arc4random() % 128 / 256.0 ) + 0.5
                                      brightness:( arc4random() % 128 / 256.0 ) + 0.5
                                           alpha:1];
     
    [subv mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.and.right.equalTo(container);
        make.height.mas_equalTo(@(20*i));
         
        if ( lastView )
        {
            make.top.mas_equalTo(lastView.mas_bottom);
        }
        else
        {
            make.top.mas_equalTo(container.mas_top);
        }
    }];
     
    lastView = subv;
}
[container mas_makeConstraints:^(MASConstraintMaker *make) {
    make.bottom.equalTo(lastView.mas_bottom);
}];

頭部效果

07.PNG

 

尾部效果

08.PNG

從scrollView的scrollIndicator可以看出 scrollView的內部已如我們所想排列好了

這里的關鍵就在于container這個view起到了一個中間層的作用 能夠自動的計算uiscrollView的contentSize

5. [高級] 橫向或者縱向等間隙的排列一組view

很遺憾 autoLayout并沒有直接提供等間隙排列的方法(Masonry的官方demo中也沒有對應的案例) 但是參考案例3 我們可以通過一個小技巧來實現這個目的 為此我寫了一個Category

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
@implementation UIView(Masonry_LJC)
- (void) distributeSpacingHorizontallyWith:(NSArray*)views
{
    NSMutableArray *spaces = [NSMutableArray arrayWithCapacity:views.count+1];
     
    for ( int i = 0 ; i < views.count+1 ; ++i )
    {
        UIView *v = [UIView new];
        [spaces addObject:v];
        [self addSubview:v];
         
        [v mas_makeConstraints:^(MASConstraintMaker *make) {
            make.width.equalTo(v.mas_height);
        }];
    }    
     
    UIView *v0 = spaces[0];
     
    __weak __typeof(&*self)ws = self;
     
    [v0 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(ws.mas_left);
        make.centerY.equalTo(((UIView*)views[0]).mas_centerY);
    }];
     
    UIView *lastSpace = v0;
    for ( int i = 0 ; i < views.count; ++i )
    {
        UIView *obj = views[i];
        UIView *space = spaces[i+1];
         
        [obj mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.equalTo(lastSpace.mas_right);
        }];
         
        [space mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.equalTo(obj.mas_right);
            make.centerY.equalTo(obj.mas_centerY);
            make.width.equalTo(v0);
        }];
         
        lastSpace = space;
    }
     
    [lastSpace mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.equalTo(ws.mas_right);
    }];
     
}
- (void) distributeSpacingVerticallyWith:(NSArray*)views
{
    NSMutableArray *spaces = [NSMutableArray arrayWithCapacity:views.count+1];
     
    for ( int i = 0 ; i < views.count+1 ; ++i )
    {
        UIView *v = [UIView new];
        [spaces addObject:v];
        [self addSubview:v];
         
        [v mas_makeConstraints:^(MASConstraintMaker *make) {
            make.width.equalTo(v.mas_height);
        }];
    }
     
     
    UIView *v0 = spaces[0];
     
    __weak __typeof(&*self)ws = self;
     
    [v0 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(ws.mas_top);
        make.centerX.equalTo(((UIView*)views[0]).mas_centerX);
    }];
     
    UIView *lastSpace = v0;
    for ( int i = 0 ; i < views.count; ++i )
    {
        UIView *obj = views[i];
        UIView *space = spaces[i+1];
         
        [obj mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(lastSpace.mas_bottom);
        }];
         
        [space mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(obj.mas_bottom);
            make.centerX.equalTo(obj.mas_centerX);
            make.height.equalTo(v0);
        }];
         
        lastSpace = space;
    }
     
    [lastSpace mas_makeConstraints:^(MASConstraintMaker *make) {
        make.bottom.equalTo(ws.mas_bottom);
    }];
}
@end

簡單的來測試一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
UIView *sv11 = [UIView new];
UIView *sv12 = [UIView new];
UIView *sv13 = [UIView new];
UIView *sv21 = [UIView new];
UIView *sv31 = [UIView new];
sv11.backgroundColor = [UIColor redColor];
sv12.backgroundColor = [UIColor redColor];
sv13.backgroundColor = [UIColor redColor];
sv21.backgroundColor = [UIColor redColor];
sv31.backgroundColor = [UIColor redColor];
[sv addSubview:sv11];
[sv addSubview:sv12];
[sv addSubview:sv13];
[sv addSubview:sv21];
[sv addSubview:sv31];
//給予不同的大小 測試效果
[sv11 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.centerY.equalTo(@[sv12,sv13]);
    make.centerX.equalTo(@[sv21,sv31]);
    make.size.mas_equalTo(CGSizeMake(40, 40));
}];
[sv12 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.size.mas_equalTo(CGSizeMake(70, 20));
}];
[sv13 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.size.mas_equalTo(CGSizeMake(50, 50));
}];
[sv21 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.size.mas_equalTo(CGSizeMake(50, 20));
}];
[sv31 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.size.mas_equalTo(CGSizeMake(40, 60));
}];
[sv distributeSpacingHorizontallyWith:@[sv11,sv12,sv13]];
[sv distributeSpacingVerticallyWith:@[sv11,sv21,sv31]];
[sv showPlaceHolderWithAllSubviews];
[sv hidePlaceHolder];

代碼效果

09.PNG

perfect! 簡潔明了的達到了我們所要的效果

這里所用的技巧就是 使用空白的占位view來填充我們目標view的旁邊 這點通過圖上的空白標注可以看出來

引自:http://www.cocoachina.com/ios/20141219/10702.html

若有侵權,請告知 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美日韩精品丝袜高跟鞋| 欧美一性一乱一交一视频| 欧美韩国理论所午夜片917电影| 亚洲人高潮女人毛茸茸| 久久天天躁日日躁| 国产精品女人久久久久久| 草民午夜欧美限制a级福利片| 国产有码在线一区二区视频| 色阁综合伊人av| 久久久久成人精品| 亚洲成人精品在线| 91精品国产综合久久香蕉最新版| 中文字幕亚洲一区二区三区| 尤物九九久久国产精品的特点| 欧美日韩一区二区在线| 国产精品一区二区久久国产| 国产一区二区三区视频免费| 青草青草久热精品视频在线观看| 日韩av理论片| 国产综合在线观看视频| 91九色单男在线观看| 国产一区二区色| 中文字幕一区二区精品| 精品五月天久久| 国产精品国产福利国产秒拍| 精品无人国产偷自产在线| 亚洲在线观看视频| 亚洲成人av在线| 国产一区二区av| 97婷婷涩涩精品一区| 亚洲2020天天堂在线观看| 亚洲天堂2020| 欧美极品少妇全裸体| 97超碰国产精品女人人人爽| 日韩中文综合网| 日韩高清电影好看的电视剧电影| 中文字幕精品久久久久| 欧美在线视频一区二区| 久久理论片午夜琪琪电影网| 欧美理论电影网| 亚洲综合中文字幕68页| 国产一区二区色| 亚洲欧美激情四射在线日| www亚洲精品| 精品一区二区电影| 国产一区二区日韩| 国产精品极品美女在线观看免费| 欧美日本亚洲视频| 国产精品美女主播在线观看纯欲| 亚洲v日韩v综合v精品v| 久久精品视频中文字幕| 亚洲伊人第一页| 欧洲一区二区视频| 精品偷拍一区二区三区在线看| 国产97人人超碰caoprom| 国产精品黄页免费高清在线观看| 精品福利视频导航| 久久综合久久88| 91精品国产高清自在线看超| 成人激情视频在线播放| 精品国产区一区二区三区在线观看| 热久久这里只有| 久久精品国产亚洲7777| 韩国19禁主播vip福利视频| 91久久国产精品| 北条麻妃一区二区在线观看| 久久久久久午夜| 日韩欧美aaa| 国产日韩欧美在线视频观看| 久久久最新网址| 免费av在线一区| 国产在线日韩在线| 91精品久久久久久久久久久久久| 日本国产欧美一区二区三区| 亚洲性线免费观看视频成熟| 国产精品偷伦免费视频观看的| 欧美日韩国产123| 国产精品国模在线| 亚洲欧美中文在线视频| 国产精品亚洲精品| 欧美最近摘花xxxx摘花| 欧美成人免费全部| 成人免费淫片视频软件| 色99之美女主播在线视频| 国产精品视频白浆免费视频| 日韩一区二区av| 精品日韩中文字幕| 国产精品va在线播放我和闺蜜| 俺去啦;欧美日韩| 亚洲国产欧美在线成人app| 精品国产91久久久久久| 精品人伦一区二区三区蜜桃免费| 国产精品久久一| 国产精品欧美日韩一区二区| 亚洲大胆人体视频| 国产精品美女久久久久久免费| 国产美女高潮久久白浆| 久久精品91久久久久久再现| 日韩av在线电影网| 久久久久免费视频| 国产亚洲精品久久久| 欧美日韩国产激情| 欧洲永久精品大片ww免费漫画| 欧美影院久久久| 国产欧美 在线欧美| 欧美亚洲视频一区二区| 国产a∨精品一区二区三区不卡| 法国裸体一区二区| 久久影院免费观看| 欧美成人合集magnet| 成人激情春色网| 国产亚洲欧美日韩精品| 青青草一区二区| 91九色国产社区在线观看| 亚洲第一页自拍| 成人av在线亚洲| 亚洲国产精品一区二区久| 欧美日韩国产限制| 日韩精品亚洲视频| 久久97精品久久久久久久不卡| 国产成人精品久久| 欧美日韩加勒比精品一区| 国产精彩精品视频| 91精品国产色综合久久不卡98| 国语自产在线不卡| 亚洲精品视频二区| 3344国产精品免费看| 久久久精品在线| 日韩免费在线播放| 欧美精品videos另类日本| 伊人久久男人天堂| 欧美日韩国产一区二区三区| 精品爽片免费看久久| 日韩69视频在线观看| 中文字幕亚洲欧美| 国产精品视频地址| 亚洲综合精品一区二区| 中文字幕av一区中文字幕天堂| 欧美亚洲第一页| 亚洲国产高潮在线观看| 久久69精品久久久久久久电影好| 中文字幕亚洲一区在线观看| 亚洲国产古装精品网站| 久久频这里精品99香蕉| 97久久精品人搡人人玩| 黑人巨大精品欧美一区二区| 91久久嫩草影院一区二区| 亚洲一区二区三区香蕉| 日韩在线激情视频| 亚洲免费精彩视频| 亚洲第一精品自拍| 国产一区玩具在线观看| 午夜欧美大片免费观看| 国产精品国内视频| 中文字幕日韩精品在线| 一区三区二区视频| 国产精品久久久久影院日本| 欧美激情手机在线视频| 亚洲aaaaaa| 久久精品成人一区二区三区| 欧美视频在线免费看| 国产精品三级美女白浆呻吟| 色琪琪综合男人的天堂aⅴ视频| 国产欧美韩国高清|