iOS iPhone 中宽度的自动布局问题

Autolayout issue for width equally in iOS iPhone

我有三个视图作为子视图,如下所示,具有 等宽和等高约束

如果视图 B 没有数据,则应显示如下

我的尝试 如果 iset B 的宽度为零,那么所有视图的宽度都将为零。

如何获取?

谢谢

首先,您需要了解您可以在 iOS 中为不同的约束赋予优先级。默认优先级为1000,最高。

现在,您需要为 equalWidth 约束设置 750 的优先级。其次,您需要应用从 ViewA 到 ViewB、ViewB 到 ViewC 的水平间距。理想情况下,水平间距的常数应为 0,这将使三个视图的边粘在一起。

现在,当您将 ViewB 的宽度设置为 0 时,您的 ViewA 和 ViewC 将占用所有 space,宽度相等,而 ViewB 将消失。

如果您对此有任何困惑,请告诉我。

首先,确保您的等宽约束设置如下:

A.width == B.width
A.width == C.width

而且不是这样的:

A.width == B.width
C.width == B.width

也就是说,确保视图 B 只涉及一个 等宽约束。

接下来,使出口连接到视图 B 和视图 B 上的等宽约束。

@property (nonatomic, strong) IBOutlet UIView *viewB;
@property (nonatomic, strong) IBOutlet NSLayoutConstraint *bEqualWidthConstraint;

要连接约束出口,您需要在故事板大纲中找到约束。这将是 A 和 B 最近的共同祖先的约束之一;它不会直接在 A 或 B 上。当您在情节提要大纲中找到它时,您可以按住 Control 键从它拖动到源代码中的插座(或者您可以通过按住 Control 键拖动到 @interface 中的任何位置来创建一个新插座)。

添加另一个 属性 以保持另一个约束设置 B 的宽度为零:

@property (nonatomic, strong) NSLayoutConstraint *bZeroWidthConstraint;

初始化bZeroWidthConstraint但不安装它:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.bZeroWidthConstraint = [NSLayoutConstraint
        constraintWithItem:self.viewB attribute:NSLayoutAttributeWidth
        relatedBy:NSLayoutRelationEqual
        toItem:nil attribute:NSLayoutAttributeNotAnAttribute
        multiplier:0 constant:0];
}

如果要隐藏视图 B,请卸载 bEqualWidthConstraint 并安装 bZeroWidthConstraint

在iOS 8.0 上,您可以通过将其active 属性 设置为NO 来卸载约束,但在早期版本上,您必须发送消息至安装约束的视图。这通常是受约束视图的最近共同祖先。假设 A 和 B 的共同祖先是 viewB.superview:

- (void)hideB {
    [self.viewB.superview removeConstraint:self.bEqualWidthConstraint];
    [self.viewB addConstraint:self.bZeroWidthConstraint];
}

请注意,由于bZeroWidthConstraint仅约束视图B,您可以直接将其安装在视图B上。

当您想再次显示视图 B 时,请卸载 bZeroWidthConstraint 并重新安装 bEqualWidthConstraint:

- (void)showB {
    [self.viewB removeConstraint:self.bZeroWidthConstraint];
    [self.viewB.superview addConstraint:self.bEqualWidthConstraint];
}

你能做的是给它添加一个宽度约束(中间一个)并使它小于 2000,优先级(1000)大于等于宽度(750)

现在做一个出口,并将约束条件(<2000)的常量设置为零。

您可以找到 sample here.

为什么我设置了2000是因为这个约束只需要将宽度归零。如果宽度不为零,它不应该影响宽度。现在由于宽度相等(中间视图)并且它应该小于 2000 因此视图在屏幕上显示相同。当我将宽度约束设置为零时,中间视图的宽度变为零,因为它的优先级高于相等宽度。


此代码将中间视图的宽度设置为零。

- (IBAction)btnClick:(id)sender {
  self.widthView2.constant = 0;
}

输出:

下载代码:根据您的要求设置约束。 Click to Download

ViewAViewC

之间的距离创建 NSLayoutConstraint _distance_ViewA_ViewC 变量
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //when viewB is hidden remove the comments
    _distance_ViewA_ViewC.constant = 8.0f;
    _viewB.hidden = true;

}

OutPut

对于 viewA, viewB, viewC


对于 viewA, ViewCviewB隐藏