ios UIViewController以编程方式定位按钮不起作用

时间:2012-11-28 05:42:23

标签: ios constraints autolayout

我想在视图中均匀分隔四个按钮。在故事板中,我将按钮定位在纵向视图中,因此间距是正确的。但是我没有找到正确的约束设置来使按钮在任何视图宽度上均匀分布(对于纵向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)动画 似乎是最好的地方。但是,如果我查看不同的视图,当我返回到此视图时,按钮将恢复到其初始(storybaord约束)指定的位置。将再次调用viewDidAppear代码,但它不会成功移动按钮。就好像他们的位置被锁定在那个时间点。

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

3 个答案:

答案 0 :(得分: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];
} 

当视图大小改变时,按钮的间距将自动调整,如同旋转一样。

答案 1 :(得分:1)

我被引导的解决方案是以编程方式向两个中间按钮(button2&amp; button3)添加约束,这两个按钮相对于视图的中间水平放置它们。这两个约束允许我完全删除手动定位代码。 Evenly space multiple views within a container view的答案帮助我走上正轨。

- (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]];

答案 2 :(得分:0)

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