在Storyboard中创建的容器视图无法通过编程方式更改框架。

4

我有一个容器视图,@property (weak, nonatomic) IBOutlet UIView *containerView;,但是当我设置它的框架时,它不会移动。这是我尝试的方法:

- (void)setFramesForCategories
{
    CGRect frame = _containerView.frame;
    frame.origin.x = 20;
    frame.origin.y = self.view.frame.size.height - 52;
    frame.size.width = 236;
    frame.size.height = 60 * [[_dataDict objectForKey:@"Key"] count];
    _containerView.frame = frame;
}

我知道这很基础,而且在我以前移动编程创建的对象时它曾经起作用,但现在对我来说不起作用了。


我已经尝试过使用静态数字而不是算法,但如果这就是你的意思,那也行不通。 - Patrick Veilleux
1
这可能与IB中视图上的布局约束有关。您需要更改这些约束、清除它们或通过更改约束而不是显式设置框架来更改容器视图的框架。 - rdelmar
@rdelmar 我发布这个问题之前确实尝试过删除约束,但删除选项是灰色的。我该如何通过代码更改它们?还是有其他方法可以删除它们? - Patrick Veilleux
谢谢@rdelmar,你给了我足够的信息让我想出如何解决它。我会发布答案。 - Patrick Veilleux
你可以使用removeConstraint:方法将它们移除,但是你需要创建出口(outlets)来引用这些约束,以便将它们作为参数传递给该方法。 - rdelmar
2个回答

13
我遇到的问题是Storyboard中设置的约束覆盖了框架更改。这就解释了为什么通过编程添加对象时我没有遇到同样的问题。要关闭项目中的约束,我所需做的就是进入Storyboard.storyboard文件,确保“工具”侧边栏处于打开状态并选择“文件检查器”选项卡。然后我在“界面生成器文档”下滚动并取消选择“使用自动布局”。之后,我重新运行该项目,发现通过编程设置框架确实可行。

4
为什么需要关闭自动布局?为什么不通过代码更改自动布局约束,然后再尝试修改框架大小呢? - jdog
2
自动布局在某些情况下为支持多个设备提供了良好的解决方案,但对于大多数项目来说通常都很糟糕。关闭它并不会让你感到难过,因为不仅是你这样做的。 - superarts.org

3

视图的“frame”属性用于布局。如果您已经在storyboard中设置了容器视图的布局,并希望在代码中移动它,请尝试使用“transform”属性。例如,“self.containerView.transform = CGAffineTransformTranslate(self.containerView.transform, 0.0, 10.0);”,可以向上移动容器视图10个点:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接