iOS 从超级视图中删除对象会破坏自动布局并禁用滚动视图

Posted

技术标签:

【中文标题】iOS 从超级视图中删除对象会破坏自动布局并禁用滚动视图【英文标题】:iOS removing an object from superview demolishes auto layout and disables scrollview 【发布时间】:2014-01-07 15:43:00 【问题描述】:

我有一个按钮,它以编程方式布局并使用手动设置的约束进行定位。然后我尝试通过调用removeFromSuperview 从视图中删除该按钮。移除按钮会导致位于按钮下方的集合视图子视图丢失其在scrollview 中的位置,并将其自身与所有其他对象后面的superview 顶部对齐。我希望集合视图可以简单地移动到按钮所在的位置,一旦按钮并且它的约束已从视图中删除。 我错过了什么?

按钮创建:

aButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[aButton addTarget:self
            action:@selector(buttonPressed:)
  forControlEvents:UIControlEventTouchUpInside];
[aButton setTitle:@"Expand" forState:UIControlStateNormal];
[aButton setTranslatesAutoresizingMaskIntoConstraints:NO];
[self addSubview:aButton];

按钮移除:

- (void)buttonPressed:(UIButton *)sender
    NSLog(@"Pressed");
    [aButton removeFromSuperview];

垂直定位(detailOfLocation 为集合视图):

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[locationImageContainer(213)][locationTitle][locationDescription][aButton][detailOfLocation]|"
                                                                     options:0
                                                                     metrics:0
                                                                       views:viewArranging]];

[编辑]

按钮的移除似乎也禁用了 UIScrollView 的滚动能力,这是放置所有东西的超级视图。

【问题讨论】:

【参考方案1】:

移除按钮后你可能会有一些不足的约束,所以也许你应该补偿这些。例如,您可能想要在locationDescriptiondetailOfLocation 之间添加一个约束,因为在移除按钮后它们的垂直位置变得不明确。滚动视图滚动也可能与约束有关。看看这个answer

【讨论】:

是的!我让按钮从视图中移除后立即应用更新的约束,现在一切都按预期显示。

以上是关于iOS 从超级视图中删除对象会破坏自动布局并禁用滚动视图的主要内容,如果未能解决你的问题,请参考以下文章

iOS中的自动布局问题

以编程方式从超级视图中删除视图后更新约束/框架(自动布局)

在超级视图中嵌入视图而不会丢失自动布局约束

自动布局约束未正确放置容器视图

iOS 自动布局错位视图的错误

UIScrollView 不使用自动布局约束