繁体   English   中英

子视图方向更改时如何旋转父视图

[英]How to rotate parent view when child view orientation changes

当其子视图的方向更改时,调整父视图的布局时出现问题。 我有一个集合视图控制器,当点击其中一个单元格时,会将子视图推到顶部。 如果在子视图可见且关闭时方向发生变化,则父视图的集合视图单元格未针对新宽度进行调整。

我应该注意,如果父视图是可见的,则可以正常工作。

唯一为我解决此问题的方法是在父视图控制器的viewDidAppear方法中使集合视图布局无效,但是对我来说,为时已晚,因为用户看到集合视图单元格的动画固定到位。

- (void) viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    [self.collectionView.collectionViewLayout invalidateLayout];
    [self.collectionView reloadData];
}

我本来希望使用viewWillAppear,但是似乎没有任何作用。 听起来只能在可见父视图时调整单元格。

有没有解决的办法?

参考此答案 ,iOS不会将方向更改事件发送到屏幕外的视图控制器,这使它们成为确定视图是否已调整大小的不可靠方法。

viewWillAppear:在您的情况下不起作用,因为iOS在调用该方法之后才调整屏幕外视图控制器视图的大小,因此您的无效和重新加载将被拉离错误的值。

我相信iOS8 + viewWillTransitionToSize:withTransitionCoordinator:方法即使在屏幕外也会触发,但我并不乐观。 以我的经验,它提供的大小并不反映视图的实际大小。 我个人比较喜欢的是viewWillLayoutSubviews ,通常通过宽度检查来保护它:

@property (nonatomic) CGFloat lastWidth;

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    if (self.lastWidth != CGRectGetWidth(self.view.bounds)) {
        self.lastWidth = CGRectGetWidth(self.view.bounds);

        // Update your collection view here.
    }
}

这样,无论何时要调整视图大小(在显示中,在方向更改动画内),您都可以更新大小信息。

尝试在父视图控制器中覆盖-(void)viewWillLayoutSubviews:方法。 在你的情况下,它像这样

-(void)viewWillLayoutSubviews {

[self.collectionView.collectionViewLayout invalidateLayout];[self.collectionView reloadData];
}

您可以尝试使布局无效并在旋转处理程序方法中重新加载。

对于iOS 8之前的版本

willRotateToInterfaceOrientation:duration:

对于iOS 8+

viewWillTransitionToSize:withTransitionCoordinator:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM