2

我想在一个视图中均匀分布四个按钮。在情节提要中,我将按钮放置在纵向视图中,因此间距是正确的。但是我没有找到正确的约束设置来使按钮在任何视图宽度(纵向 iPad 或横向方向)下均匀分布。因此,我添加了以下代码片段,使用第一个和第四个按钮作为锚点将按钮移动到所需位置:

// evenly space the buttons
CGPoint leftPoint = self.button1.center;
CGPoint rightPoint = self.button4.center;
CGFloat width = rightPoint.x - leftPoint.x;
leftPoint.x += width / 3;
rightPoint.x -= width / 3;
self.button2.center = leftPoint;
self.button3.center = rightPoint;

定位代码工作正常,但我的困难是找到进行调整的最佳位置。- (void)viewDidAppear:(BOOL)animated 似乎是最好的地方。但是,如果我继续使用不同的视图,当我返回此视图时,按钮将恢复到它们的初始(故事板约束)指定位置。viewDidAppear 代码将被再次调用,但它没有成功移动按钮。就好像他们的位置在那个时间点被锁定了一样。

我想我的主要问题是是否有办法使用约束来实现我所追求的均匀间距。或者次要问题是如何覆盖这两个按钮的自动定位。

4

3 回答 3

2

使用布局约束这是一件相对困难的事情,它完全取决于您想要什么。我在这里有一个示例,它创建了 4 个按钮(在代码中)以及 5 个用作按钮之间的分隔符的标签。按钮的大小由它们固有的内容大小决定,并且按钮之间的间距以及按钮与包含视图的侧面之间的间距都是相同的。

-(void)viewDidLoad {
   [super viewDidLoad];

    NSMutableDictionary *viewsDict = [NSMutableDictionary dictionary];
    NSArray *titles = @[@"Short",@"Longer",@"Short",@"The Longest"];
    for (int i=1; i<5; i++) {
        UIButton *b = [UIButton buttonWithType:1];
        [b setTitle:titles[i-1] forState:UIControlStateNormal];
        [b setTranslatesAutoresizingMaskIntoConstraints:NO];
        [viewsDict setObject:b forKey:[NSString stringWithFormat:@"b%d",i]];
    }

    for (int i=1; i<6; i++) {
        UILabel *l = [[UILabel alloc ]init];
        [l setTranslatesAutoresizingMaskIntoConstraints:NO];
        [viewsDict setObject:l forKey:[NSString stringWithFormat:@"l%d",i]];
    }

    for (id obj in viewsDict.allKeys) 
        [self.view addSubview:viewsDict[obj]];

    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|[l1][b1][l2(==l1)][b2][l3(==l1)][b3][l4(==l1)][b4][l5(==l1)]|"
                                                                   options:NSLayoutFormatAlignAllBaseline
                                                                   metrics:nil
                                                                     views:viewsDict];

    NSArray *constraints2 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[b1]-|"
                                                                   options:0
                                                                   metrics:nil
                                                                     views:viewsDict];


    [self.view addConstraints:constraints];
    [self.view addConstraints:constraints2];
} 

当视图大小发生变化时,按钮的间距将自动调整,例如旋转。

于 2012-11-28T16:16:40.513 回答
1

我得到的解决方案是以编程方式向两个中间按钮(button2 和 button3)添加约束,使它们相对于视图的中间水平放置。这两个约束让我完全删除了手动定位代码。在容器视图中均匀分布多个视图的答案帮助我走上了正确的轨道。

- (void)viewDidLoad
{
...
    self.button2.translatesAutoresizingMaskIntoConstraints = NO;
    self.button3.translatesAutoresizingMaskIntoConstraints = NO;

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.button2 attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual 
         toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:0.667 constant:0]];

    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.button3 attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual 
        toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.333 constant:0]];
于 2012-11-29T03:04:30.407 回答
0

对于几乎任何布局问题使用layoutSubviews方法的情况,它都是这样做的地方。

于 2012-11-28T05:57:25.797 回答