自动布局 - 以编程方式垂直排列元素,中间有空格?

Posted

技术标签:

【中文标题】自动布局 - 以编程方式垂直排列元素,中间有空格?【英文标题】:Autolayout - arrange elements vertically with space in between programatically? 【发布时间】:2014-01-17 02:39:15 【问题描述】:

我目前正在手动定位我的 UI 元素,如果我更新文本或添加元素会很烦人,因为我每次都必须重新计算所有位置。

有没有办法使用自动布局来调整元素的大小和位置,例如如下,无论标签包含多少文本?

UILabel (multiline, variable height)
[20px gap]
UILabel (multiline, variable height)
[20px gap]
UIButton

【问题讨论】:

【参考方案1】:

是的,它看起来像这样

@implementation MyClass 
    NSDictionary *_viewsDictionary;



- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier

    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) 
        // First create your controls - you can just use CGRectZero
        _label1 = [[UILabel alloc] initWithFrame:CGRectZero];
        _label1 setText:@"Some text";

        _label2 = [[UILabel alloc] initWithFrame:CGRectZero];
        _label2 setText:@"Some text 2";

        _button = [[UIButton alloc] initWithFrame:CGRectZero];

        // Then just add them to your as a sub view
        [self addSubview:self.currentBalanceLabel];
        [self addSubview:_nameLabel];
        [self addSubview:_button];

        // Put them in an NSDictionary - this is a macro and will be used when setting up the contraints below
        _viewsDictionary = NSDictionaryOfVariableBindings(_nameLabel, _currentBalanceLabel,_button);

        // This tells the view to run update contraints
        [self setNeedsUpdateConstraints];
        [self updateConstraintsIfNeeded];
    



- (void)updateConstraints

    [super updateConstraints];

    // Using the _viewsDictionary, we must tell always tell how all the controls will be setup both 
    // horizontally and vertically.  In this case wear are going to tell the label to take the entire width
    // The rest of the vies will be aligned on the left below
    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_label1]-|"
                                                                   options:0
                                                                   metrics:nil
                                                                     views:_viewsDictionary];

    //Add the contraints
    [self addConstraints:constraints];

    // Next setup the vertical contraints.  This is what you asked about spefically, label - 20 - label - 20 - button
    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[_labelq]-20-[_label2]-20-[_button]"
                                                          options: NSLayoutFormatAlignAllLeft
                                                          metrics:nil
                                                            views:_viewsDictionary];


    [self addConstraints:constraints];




@end

【讨论】:

对此进行扩展一点:从概念上讲,正在发生的事情是,是的,您可以设置它。为此,您需要在程序运行时手动更新项目的约束(与仅使用在 Interface Builder 中添加的约束相比)。上面的代码是这样做的,取自在 TableView 中工作的应用程序。出于您的目的,重要的是在 updateConstraints 方法中创建约束。

以上是关于自动布局 - 以编程方式垂直排列元素,中间有空格?的主要内容,如果未能解决你的问题,请参考以下文章

垂直对齐父元素以排列中间子元素

以编程方式自动布局不垂直居中

以编程方式自动布局垂直ios时出错

ios 6:使用自动布局约束垂直居中 UILabel

如何以编程方式使用自动布局排列这三个 UILabel?

UICollectionView 单元格垂直排列而不是网格