如何强制UIView的layoutSubviews。

我有一个自定义的UIView有一个专门的,手动设置框架纵向和横向,因为autoresizingMasks只是不工作在我的情况。

我把这个框架设置在:

- (void)viewWillAppear:(BOOL)animated 

它按预期工作。

现在我的问题是,我的UIView还有子视图,也有专门的肖像/风景的位置。

我将这些子视图定位在:

 - (void)layoutSubviews 

如果我现在离开我的viewController在纵向方向,旋转到另一个viewController横向,然后回到这个viewController我看到我的看法得到正确的resize,但我的视图,在layoutSubviews定位的子视图尚未重新定位,但在已经出现的观点之后,以animation的方式resize。

我什么都不做,我已经试过打电话了

  - (void)layoutIfNeeded 

以及:

  - (void)setNeedsLayout 

有鉴于此,似乎并没有改变什么。

任何想法我做错了什么?

谢谢。

今天有类似的问题。 我先打电话来解决这个问题

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

不知道这是否是最好的方法,但它的工作原理;)

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

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

在layoutSubviews中不需要任何显式animation(不知道是否有,但听起来像这样),因为任何帧更改都将同步到旋转animation。

在离屏时,方向仍然应该旋转,所以当再次在屏幕上转换时,应该正确定位视图。

我还build议观看WWDC 2010会议123“build立animation驱动用户界面”,其中详细介绍了这些内容。

在swift 3 @iOS 10.1上

 override func viewWillAppear(animated: Bool){ //Doesn`t neeed to call super to work view.setNeedsLayout() } 

运行完美

对我来说,工作是[self.view setNeedsDisplay] 。 这在整个视图上调用重绘。 你也可以通过在特定的视图上调用setNeedsDisplay来重新绘制选定的视图,这在我的例子中是这样做的,它完美的工作。