1

这是一个非常简单(可能很愚蠢)的问题,但我似乎找不到最干净和最好的方法。我有三个按钮,在纵向模式下看起来不错。我还可以通过添加 autoResizingMasks 来使中心始终居中:

[self.centerButton setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin];

但是,我不确定处理左右按钮的最佳方式。见下图;我需要的是让他们稍微移动一下,在中间和左/右边缘之间居中: 在此处输入图像描述

对于这个可能愚蠢的问题,我很抱歉,因为我确信这可以通过 IB 或(最好)代码相当容易地完成,但我只是想了解正确和最干净的方法。提前致谢!

编辑

一些附加信息,我正在使用 iPad,底部的按钮实际上包含在底部的一个名为“buttonPanel”的子视图中。

根据其中一个答案的建议,我添加了以下代码;见下文。但是,我只得到“无法同时满足约束”。添加此代码时出错,并且当它列出约束时,它只列出下面的那些,因此此视图上没有其他附加约束。下面的代码有问题吗?担心我在这里遗漏了一些明显的东西..

- (void) viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.buttonPanel removeConstraint:conLeft];
    [self.buttonPanel removeConstraint:conRight];

    float paddingPortrait = 20; // pd
    float paddingLandscape = 50; // ld
    float widthOfView = 768;
    float heightOfView = 249;

    float denominatorVal = heightOfView - widthOfView;

    float leftMultiplier = (paddingLandscape - paddingPortrait) / denominatorVal;
    float rightMultiplier = (denominatorVal + paddingPortrait - paddingLandscape) / denominatorVal;
    float leftConstant = paddingPortrait - (widthOfView * leftMultiplier);
    float rightConstant = -leftConstant;

    conLeft = [NSLayoutConstraint constraintWithItem:self.leftButton attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.buttonPanel attribute:NSLayoutAttributeRight multiplier:leftMultiplier constant:leftConstant];
    conRight = [NSLayoutConstraint constraintWithItem:self.rightButton attribute:NSLayoutAttributeTrailing relatedBy:0 toItem:self.buttonPanel attribute:NSLayoutAttributeRight multiplier:rightMultiplier constant:rightConstant];
    [self.buttonPanel addConstraints:@[conRight,conLeft]];
}

这是抛出的错误:

Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 

  "(NSAutoresizingMaskLayoutConstraint:0x8b36ce0 h=&-& v=&-- H:[UIButton:0x8874200(166)])",
"(NSAutoresizingMaskLayoutConstraint:0x8b38720 h=&-& v=&-- H:[UIImageView:0x8877880(200)])",
"(NSAutoresizingMaskLayoutConstraint:0x8b38640 h=&-& v=&-- UIImageView:0x8877880.midX == 0.165365*UIView:0x8876c00.width)",
"(NSLayoutConstraint:0x8b3a780 UIImageView:0x8877880.leading == 0.127119*UIView:0x8876c00.right - 77.6271)",
"(NSLayoutConstraint:0x8b3a6a0 UIButton:0x8874200.trailing == 0.872881*UIView:0x8876c00.right + 77.6271)",
"(NSAutoresizingMaskLayoutConstraint:0x8b36ca0 h=&-& v=&-- UIButton:0x8874200.midX == 0.848958*UIView:0x8876c00.width)"

)

将尝试通过打破约束来恢复 (NSLayoutConstraint:0x8b3a6a0 UIButton:0x8874200.trailing == 0.872881*UIView:0x8876c00.right + 77.6271)

4

3 回答 3

3

如果您使用布局约束,您可以结合在 IB 中设置按钮,然后在代码中调整它们来实现。将中间按钮居中并将 2 个外部按钮与边缘的标准距离(即 20 点)。使IBOutlets为左右约束,在viewWillLayoutSubviews方法中改变:

 @implementation ViewController {
 IBOutlet NSLayoutConstraint *conLeft;
 IBOutlet NSLayoutConstraint *conRight;
}


- (void)viewWillLayoutSubviews {
    if (self.view.bounds.size.width > self.view.bounds.size.height) {
        conLeft.constant = 50;
        conRight.constant = 50;
    }else{
        conLeft.constant = 20;
        conRight.constant = 20;
    }
}

编辑后:

Rob 关于使用 constraintWithItem 是正确的——如果你为乘数和常数输入正确的值,当视图旋转时你不需要做任何事情,约束系统会处理它。因此,使用我在上面设置的相同按钮,您可以这样做:

@implementation ViewController {
    IBOutlet NSLayoutConstraint *conLeft;
    IBOutlet NSLayoutConstraint *conRight;
    IBOutlet UIButton *lButton;
    IBOutlet UIButton *rButton;
}

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.view removeConstraint:conLeft];
    [self.view removeConstraint:conRight];
    conLeft = [NSLayoutConstraint constraintWithItem:lButton attribute:NSLayoutAttributeLeading relatedBy:0 toItem:self.view attribute:NSLayoutAttributeRight multiplier:0.1316 constant:-22.11];
    conRight = [NSLayoutConstraint constraintWithItem:rButton attribute:NSLayoutAttributeTrailing relatedBy:0 toItem:self.view attribute:NSLayoutAttributeRight multiplier:0.8684 constant: 22.11];
    [self.view addConstraints:@[conRight,conLeft]];
}

所以我删除了在 IB 中制作的左右约束(但留下了在那里制作的任何其他约束)并在代码中重新制作它们。请注意,两个按钮的位置都参考了视图的右侧(在 iPhone 上的值为 320),因此您可以同时使用乘数和常量(左侧的值为 0,因此乘数在那里不会有用)。需要一些代数和基本的约束公式来确定这些值应该是什么。在这种情况下(iPhone 4"),公式为:

对于左键:乘数 = (ld - pd)/228

对于右键:乘数 = (228 + pd - ld)/228(请注意,它也等于 1-左按钮乘数)

pd 是与纵向边缘的距离(在我的示例中为 20 或标准)

ld 是距横向边缘的距离(在我的示例中为 50)

常数值可以通过将左键乘数的值代入下式来计算:320 * 乘数 + 常数 = pd

于 2013-01-12T21:53:25.583 回答
1

简单的方法

您可以在水平轴上免费使用这些按钮。在这种情况下,横向/纵向的右/左按钮和适当的视图边框之间会有更多的空间。

在此处输入图像描述

(第二条路径)iOS6方式:

在 iOS6 中,您可以使用自动布局和约束。它太有用了。你可以用它做任何你想做的事情。

有很多关于它的教程。我试图准确地找到您的问题,但失败了。我在这里触及了自动布局。

于 2013-01-12T21:46:28.050 回答
0

对其他两个按钮也使用自动调整大小的蒙版。对于左下角的圆圈,将其设置为灵活的顶部和灵活的右侧。对于右下角的圆圈,使用灵活的顶部和灵活的左侧。

编辑-我刚刚注意到您似乎希望外部边距在横向上增加一点。我的解决方案不会那样做。事实上,基本的自动调整大小蒙版无法处理这种情况。

您最好的viewWillLayoutSubviews方法可能是实现视图控制器的方法并手动设置圆圈的视图以满足您的需要。

于 2013-01-12T21:41:14.603 回答