使用Storyboard动态修改约束

很好用的第三方约束框架“Masonry”,可以随时修改约束:

 [self.titleLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
      make.leading.equalTo(self.backButton.mas_trailing).offset(5);
      make.centerY.equalTo(self.backButton.mas_centerY);
      make.trailing.equalTo(self.shareButton.mas_leading).offset(-10);
 }];

现在,我们需要在Storyboard或xib中动态修改约束。

一、场景:

先看下最终效果:


F2FD1FA4-2E71-473C-BEC7-33AB3E5C5E19.png

标题与按钮之间的距离是变动的。根据状态的不同,标题的右边距可能在“查看”按钮的左边,可能在“重拍”按钮的左边。

二、遇到的坑

  1. 把约束设置为全局的私有变量;


    4A1A0AF1-ED9E-4F3B-9DFF-CEB5D1D45B89.png

    然并卵。因为我们的约束是在UITableView视图的Cell中。这个约束不能确定具体是UITableView的哪一个个cell。

  2. 边距设置在“查看”按钮左边。


    C4F2A30B-180C-4D4B-BC76-46301E27BECB.png

    如果“查看”按钮没有固定宽度:在需要隐藏“查看”的时候可以把“查看”按钮的标题置nil或“”字符串,这样标题右边距自然会移动到“拍摄”按钮的左边。

10B9C489-1FE1-4507-9E87-00D2D55AA74C.png

然而,现在“查看”按钮宽度固定,而且与“拍摄”按钮同宽。问题仍在。

  1. 在2坑的基础上引入。
    把“查看”按钮不设置为与“拍摄”按钮同宽,而是单独设置宽度约束:
    (1)在需要隐藏“查看”时,可以设置“查看”宽度约束的constant等于0;
    (2)在需要显示的时候,设置其宽度约束的constant等于“拍摄”按钮宽度。
    问题来了,如何找到UITableView的Cell中的“查看”按钮的宽度约束?

三、使用属性Identifier

使用约束(NSLayoutConstraint)对象的Identifier属性可以找到我们要找的约束。


7B5CF628-8B0B-4AAA-BA31-2190845097FB.png

(这里没有设置“查看”按钮宽度约束的Identifier。不过效果一样的,而且更简单。)

上代码:

if (examRoom.shotState) {
    ((UIButton *)[cell viewWithTag:15]).hidden = YES;  //上传按钮
    ((UIButton *)[cell viewWithTag:16]).hidden = NO;   //查看
    ((UIButton *)[cell viewWithTag:17]).hidden = NO;   //拍摄/重拍
    [((UIButton *)[cell viewWithTag:17]) setTitle:@"重拍" forState:UIControlStateNormal];
        
    [[self class] updateConstraint:[cell contentView] hidden:YES];
 }else {
    ((UIButton *)[cell viewWithTag:15]).hidden = YES;
    ((UIButton *)[cell viewWithTag:16]).hidden = YES;
    ((UIButton *)[cell viewWithTag:17]).hidden = NO;
    [((UIButton *)[cell viewWithTag:17]) setTitle:@"拍摄" forState:UIControlStateNormal];
        
    // 在cell.contentView中找约束,设置Constant
    [[self class] updateConstraint:[cell contentView] hidden:NO];
}
+ (void)updateConstraint:(UIView *)view hidden:(BOOL)hidden {
    NSArray *constraints = view.constraints;
    NSUInteger count = [constraints count];
    int index = 0;
    BOOL found = NO;
    while (!found && index < count) {
        NSLayoutConstraint *constraint = constraints[index];
        //遍历约束,找到Identifier=@“nameLabelConstraint”的约束
        if ([constraint.identifier isEqualToString:@"nameLabelConstraint"]) {
            found = YES;
            
            constraint.constant = hidden ? 60.0 : 0.0;
        }
        
        index++;
    }
}

四、总结

总结一下:

1,在选择使用Storyboard的时候要考虑清楚自己的需求。

Storyboard使用起来是非常方便,所见即所得。
但坑起来,也急死人。比如:多人用svn维护一个Storyboard,一不注意就会出现一堆冲突,很不容易解决,最后可能还得重做。
而且很多功Storyboard不能实现。比如:复杂动画,在UIScrollview中动态添加视图等等等。

2,Storyboard中,深挖NSLayoutConstraint每个属性的功能。

  • Constant:边距具体数字。
  • Priority:优先级。
  • Multiplier:宽高比例。
  • Identifier:标识符。
    等等。

3,本文中的代码

传送门

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,874评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,102评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,676评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,911评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,937评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,935评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,860评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,660评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,113评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,363评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,506评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,238评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,861评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,486评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,674评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,513评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,426评论 2 352

推荐阅读更多精彩内容