58

我有一个自定义 UIView,它有一个专门的、手动设置的纵向和横向框架,因为 autoresizingMasks 在我的情况下不起作用。

我将此框架设置为:

 - (void)viewWillAppear:(BOOL)animated

它按预期工作。

我现在的问题是,我的 UIView 还具有子视图,这些子视图也有专门的纵向/横向位置。

我将这些子视图定位在:

- (void)layoutSubviews

如果我现在让我的 viewController 保持纵向,在另一个 viewController 上旋转到横向,然后返回到这个 viewController,我看到我的视图已正确调整大小,但我的视图的子视图(位于 layoutSubviews 中)尚未重新定位,但是在视图已经出现后以动画方式调整大小。

我在 viewDidAppear 中什么都不做,我已经尝试过调用

 - (void)layoutIfNeeded

也:

 - (void)setNeedsLayout

viewWillAppear,但它似乎并没有改变任何东西。

任何想法我做错了什么?

4

4 回答 4

107

今天遇到了类似的问题。我通过第一次调用解决了它

  • -setNeedsLayout:设置视图需要布局的标志,然后调用
  • -layoutIfNeeded: 立即检查标志 - 因为它是之前手动设置的 - 结果 layoutSubviews 被调用。

不知道这是否是最好的方法,但它有效;)

于 2013-02-28T17:02:03.137 回答
5

我建议在 viewDidLoad 中设置初始框架,然后更改视图框架以更改方向

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

您不需要 layoutSubviews 中的任何显式动画(不确定是否有,但听起来很像),因为任何帧更改都将同步到旋转动画。

离开屏幕时,方向仍应旋转,因此当再次转换回屏幕时,您的视图应正确定位。

我还建议观看 WWDC 2010 Session 123 “Building Animation Driven UI”,它更详细地介绍了这些内容。

于 2011-09-27T23:39:34.753 回答
4

在 swift 3 @iOS 10.1

override func viewWillAppear(animated: Bool){

    super.viewWillAppear(animated)
    view.setNeedsLayout()
}

完美运行

于 2016-11-23T17:39:14.140 回答
-2

对我来说有效的是[self.view setNeedsDisplay]。这会在整个视图上调用重绘。您还可以通过调用setNeedsDisplay特定视图来重绘选定视图,我在本例中就是这样做的,并且效果很好。

于 2015-04-28T13:04:59.267 回答