当方向更改其子视图时,我在调整父视图的布局时遇到问题。我有一个集合视图控制器,当其中一个单元格被轻敲时,将顶部的子视图推送。如果在子视图可见且已取消时发生方向更改,则父视图的集合视图单元格不会针对新宽度进行调整。
我应该注意,如果父视图可见,这样可以正常工作。
唯一能解决这个问题的方法是在父视图控制器的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,但似乎没有做任何事情。听起来它只能在父视图可见时调整单元格。
有解决方法吗?
答案 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: