【问题标题】:Unable to resize a UIView无法调整 UIView 的大小
【发布时间】:2012-10-19 12:31:34
【问题描述】:

我正在使用 xcode 4.5(以防万一)和 Storyboard,我正在尝试做一些看似非常简单但没有任何运气的事情。在我的故事板视图中,我放置了一个 UIView 组件,正如您在http://www.shopow.co.uk/assets/storyboard-view.png 的图像中看到的那样,其中绿色部分是高度为 100 的 UIView

在 viewDidLoad 方法中我添加了以下代码

NSLog(@"View Height: %f", self.testView.bounds.size.height);

CGRect viewFrame = self.testView.frame;
CGSize newSize = CGSizeMake(viewFrame.size.width, 300);
viewFrame.size = newSize;
self.testView.frame = viewFrame;

NSLog(@"View Height: %f", self.testView.bounds.size.height);

根据我所读到的关于调整大小的内容,我假设绿色部分的大小调整为 300 高,但这不会发生,尽管日志窗口中的输出显示以下内容

2012-10-19 13:05:28.015 TableTest[54318:c07] View Height: 460.000000
2012-10-19 13:05:28.016 TableTest[54318:c07] View Height: 300.000000

注意初始高度是 460 而不是 100,这可能意味着什么!

iOS 模拟器显示此http://www.shopow.co.uk/assets/simulator-view.png

据我所知,我必须忽略一些明显的事情,这没有按预期工作。任何指导将不胜感激。

【问题讨论】:

  • testView 是否链接到绿色视图?似乎您将其链接到控制器的视图
  • 嗨,要添加 UIView,我只是将其拖入,然后将其链接为 .h 文件中的属性,就像 @property (strong, nonatomic) IBOutlet UIView *testView; 一样,然后在 .m 文件中合成它。我应该换一种方式吗?

标签: objective-c ios xcode uiview


【解决方案1】:

我不确定它是否能解决您的问题,但您确实应该在 viewWillAppear 而不是 viewDidLoad 中调整视图大小。

viewDidLoad 的字面意思是“视图已加载”。但是,此时您的 nib 可能没有按照您的预期设置视图。

作为测试,尝试在viewDidLoadviewWillAppear 中记录以下内容

NSLog(@"frame: %@", NSStringFromCGRect(self.view.frame));

您应该看到,在这两种方法中,您会得到不同的结果。 viewWillAppear 方法更可能是正确的,因为视图已经设置好并且可以呈现了。

我个人很少使用 Interface Builder,因为它引起的头痛超出了我的处理能力,但也许您设置了自动调整大小的蒙版或弹性约束,这会影响您的视图尺寸?

【讨论】:

  • 嗨,正如我在另一条评论中提到的,我尝试在 viewWillAppearviewDidAppear 方法中实现它,但结果相同。尽管我根本没有调整它们,但我会查看约束以查看它们是否会导致任何问题,并且我(可能是错误地)假设使用默认设置可以调整大小。
  • 我认为默认情况下自动调整大小设置为约束视图的所有尺寸。检查 IB 并删除所有约束(如果有)。除此之外,还有其他事情可能是超然的。
  • 即使删除所有约束子视图也不会调整大小。我创建了一个带有单个故事板场景的新项目,并在其中尝试使用相同的代码排除其他任何事情,但仍然会发生同样的事情。在自动布局打开和关闭的情况下也会发生这种情况,在这两种情况下都删除了任何约束或以其他方式。我很好,真的坚持这一点,我也找不到任何可以看到它工作的样本,所以我可以比较我正在做的事情。
  • 最后竟然是AutoLayout。感谢您的所有帮助。
【解决方案2】:

就像@CaptainRedmuff 所说,你用错误的方法调用它。 viewDidLoad 在视图加载后调用,这意味着框架已经设置好了。您正在寻找的方法是loadView,因为viewWillAppear:animatedviewDidAppear:animatedviewDidLoad 之后被调用。

【讨论】:

  • 嗨,我把它换了,所以代码现在在 loadView 方法中实现,但我仍然得到相同的结果。我还在viewWillAppearviewDidAppear 方法中尝试过,结果相同
【解决方案3】:

OP 并不清楚他是如何解决的。以防其他人遇到此问题。

如果您的视图显示的布局与您在情节提要中看到的布局相同,尽管您正在以某种方式以编程方式调整/更改其属性,这是因为自动布局正在造成严重破坏。

只需选择要以编程方式更改的视图,然后转到“属性”窗格中的“文件检查器”。取消选中使用自动布局旁边的复选框。再次运行,你会发现你的问题神奇地消失了。

【讨论】:

    猜你喜欢
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多