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

时间:2015-08-14 14:40:28

标签: ios uicollectionview orientation-changes

当方向更改其子视图时,我在调整父视图的布局时遇到问题。我有一个集合视图控制器,当其中一个单元格被轻敲时,将顶部的子视图推送。如果在子视图可见且已取消时发生方向更改,则父视图的集合视图单元格不会针对新宽度进行调整。

我应该注意,如果父视图可见,这样可以正常工作。

唯一能解决这个问题的方法是在父视图控制器的viewDidAppear方法中使集合视图布局无效,但对我来说,由于用户看到集合视图单元格的动画,因为它太晚了到位。

template <typename T>
T decoder(std::string s);

template<>
Hobbit decoder(std::string s)
{
    return HobbitHelper::decode(s);
}

template<>
Wizard decoder(std::string s)
{
    return Apprentice::decode(s);
}

我更倾向于使用viewWillAppear,但似乎没有做任何事情。听起来它只能在父视图可见时调整单元格。

有解决方法吗?

3 个答案:

答案 0 :(得分:2)

参考this answer,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.
    }
}

这样,只要您的视图要调整大小(在显示时,在方向更改动画内),您就可以更新大小信息。

答案 1 :(得分:1)

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

-(void)viewWillLayoutSubviews {

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

答案 2 :(得分:0)

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

适用于iOS 8之前

willRotateToInterfaceOrientation:duration:

适用于iOS 8 +

viewWillTransitionToSize:withTransitionCoordinator: