【问题标题】:iOS8 Auto layout programmatically pin to relative layout marginiOS8自动布局以编程方式固定到相对布局边距
【发布时间】:2014-11-27 05:18:21
【问题描述】:

我有一个 UI 元素(实际上是UISwitch,但实际上并不重要),它的前导和尾随空格都固定在 Interface Builder 中的超级视图上。 Xcode 6 中的约束如下所示:

前导空格的约束实际上是相同的。约束值是42.0分

这正是我想要的,因为对于不同的设备,我可以更改 UIView 上的 layoutMargins 属性,并且约束将正常工作,以增加视图之间的边距。

现在我想在代码中添加另一个视图,它也将前导和尾随空格固定到它的超级视图边距,因此将相同的 layoutMargins 设置为超级视图将起作用。

我使用 视觉格式语言 固定视图,语法如下:

NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-42.0-[separatorView]-42.0-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(self.contentView, separatorView)];

[self.contentView addConstraints:constraints];
[self.contentView setNeedsUpdateConstraints];

这行得通,但是layoutMargins属性使用这个约束没有效果,所以它显然不是固定到margin,而是直接固定到superview。

所以我的问题是:

如何使用可视格式语言将 UI 元素空间固定到代码中的边距?或者如果不可能,如何使用constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant: API 固定?

【问题讨论】:

    标签: ios ios8 autolayout xcode6 visual-format-language


    【解决方案1】:

    在 iOS8 中,视觉格式语言已更新为“|-”或“-|”将默认使用由超级视图的 layoutMargins 属性定义的间距。

    所以使用视觉格式语言的答案如下:

    // programmatically set the layoutMargins, only if
    // you want non-default values and they are not already set in IB!
    self.contentView.layoutMargins = UIEdgeInsetsMake(0,42,0,42); // set left and right margins to 42
    
    // assume: seperatorView is already a subview of self.contentView
    
    // separatorView will use the constraints because we write "-" between it and the superview edge
    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-[separatorView]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(separatorView)];
    [self.contentView addConstraints:constraints];
    

    如果您想在通过直接 API 创建约束时引用布局边距,则使用新的 iOS8 only 布局属性:

    NSMutableArray * constraints = [NSMutableArray array]; 
    [constraints addObject:[NSLayoutConstraint constraintWithItem:self.contentView 
         attribute:NSLayoutAttributeLeftMargin 
         relatedBy:NSLayoutRelationEqual 
         toItem:separatorView
         attribute:NSLayoutAttributeLeft
         multiplier:1.0
         constant:0]];
    [constraints addObject:[NSLayoutConstraint constraintWithItem:self.contentView 
         attribute:NSLayoutAttributeRightMargin 
         relatedBy:NSLayoutRelationEqual 
         toItem:separatorView
         attribute:NSLayoutAttributeRight
         multiplier:1.0
         constant:0]];
    [self.contentView addConstraints:constraints];
    

    【讨论】:

      【解决方案2】:

      我同意,“在 iOS8 中,视觉格式语言已更新,因此“|-”或“-|”将默认使用超级视图的 layoutMargins 属性定义的间距。”

      因此,当您使用 Interface builder 来辅助布局时,您应该勾选“Constrains to margin”选项。如果是这样,那么它确实有效。

      如果问题还没有解决,能否给我一个演示项目?

      添加: This article 向我们展示了新的 ios8 API 保留SuperviewLayoutMargins 的功能,希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-23
        • 1970-01-01
        • 2012-07-15
        • 1970-01-01
        相关资源
        最近更新 更多