如何使用目标c在循环中添加Constraint

时间:2016-02-04 11:05:08

标签: ios objective-c autolayout

在UIButton循环问题中使用“addConstraint”时会出现按钮x位置,

for (int ix = 0; ix<7; ix++) {

        UIButton *segmentButton = [[UIButton alloc] init];
        [segmentButton setTitle:[_segmentButtonTitleArray objectAtIndex:ix] forState:UIControlStateNormal];
        [_segmentView addSubview:segmentButton];

            [segmentButton setTranslatesAutoresizingMaskIntoConstraints:NO];

            [_segmentView addConstraint:[NSLayoutConstraint constraintWithItem:segmentButton
                                                                  attribute:NSLayoutAttributeWidth
                                                                  relatedBy:NSLayoutRelationEqual
                                                                     toItem:_segmentView
                                                                  attribute:NSLayoutAttributeWidth
                                                                 multiplier:1.0/7
                                                                   constant:0]];
            [_segmentView addConstraint:[NSLayoutConstraint constraintWithItem:segmentButton
                                                                  attribute:NSLayoutAttributeHeight
                                                                  relatedBy:NSLayoutRelationEqual
                                                                     toItem:nil
                                                                  attribute:NSLayoutAttributeNotAnAttribute
                                                                 multiplier:1.0
                                                                   constant:segmentButton.frame.size.height]];

            [_segmentView addConstraint:[NSLayoutConstraint constraintWithItem:segmentButton
                                                                     attribute:NSLayoutAttributeLeft
                                                                     relatedBy:NSLayoutRelationEqual
                                                                        toItem:_segmentView
                                                                     attribute:NSLayoutAttributeLeft
                                                                    multiplier:1.0
                                                                      constant:segmentButtonXposition]];

            [_segmentView addConstraint:[NSLayoutConstraint constraintWithItem:segmentButton
                                                                     attribute:NSLayoutAttributeTop
                                                                     relatedBy:NSLayoutRelationEqual
                                                                        toItem:_segmentView
                                                                     attribute:NSLayoutAttributeTop
                                                                    multiplier:1.0
                                                                      constant:segmentButton.layer.frame.origin.y]];

        segmentButtonXposition = segmentButtonXposition +1+_segmentView.frame.size.width/7-1;
    }

期望的结果是这样的,但是无法产生结果。

Desired Result

1 个答案:

答案 0 :(得分:0)

旋转后肯定会占用前一个宽度。了解如何计算约束的left属性值;来自segmentVIew's框架,您在轮换后没有更新。

因此,如果我们说纵向方向,您的计算结果为768/7 = ~109。但是,对于横向方向,此计算不正确,constraint.constant值应使用1024/7 = ~146更新。但是你没有这样做,所以正在采取旧的价值。

要解决此问题,您可以在每次设备轮换时更新每个约束。但这将是乏味的,因为您需要为每个约束设置一个变量,然后遍历所有约束。

更好的方法是保持每个UILabel的相等宽度约束。

  
      
  1. 每个标签的等宽
  2.   
  3. label1.leading = segmentView.leading
  4.   
  5. label7.trainling = segmentView.trailing
  6.   
  7. label(n).trailing = label(n + 1).leading
  8.   

供参考检查我的回答here。通过它应用于UIScrollView,但它将帮助您理解这种逻辑。而且我已经使用了VFL来更加简洁。