我无法在两个子类化的CollectionViewFlowLayouts之间切换。
我在我的collectionViewController中调用以下方法:
头:
@property (nonatomic, strong) PortraitFlowLayout *portraitFlowLayout;
@property (nonatomic, strong) LandscapeFlowLayout *landscapeFlowLayout;
实现:
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
[super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
if (UIDeviceOrientationIsPortrait(toInterfaceOrientation)) {
self.landscapeFlowLayout = nil;
[self portraitFlowLayout];
NSLog(@"Orientation portrait");
} else {
self.portraitFlowLayout = nil;
[self landscapeFlowLayout];
NSLog(@"Orientation landscape");
}
[self.collectionView.collectionViewLayout invalidateLayout];
}
并在同一collectionViewController中:
- (LandscapeFlowLayout *)landscapeFlowLayout
{
if (_landscapeFlowLayout == nil) {
_landscapeFlowLayout = [[LandscapeFlowLayout alloc] init];
self.collectionView.collectionViewLayout = _landscapeFlowLayout;
}
[self.collectionView.collectionViewLayout invalidateLayout];
return _landscapeFlowLayout;
}
- (PortraitFlowLayout *)portraitFlowLayout
{
if (_portraitFlowLayout == nil) {
_portraitFlowLayout = [[PortraitFlowLayout alloc] init];
self.collectionView.collectionViewLayout = _portraitFlowLayout;
}
[self.collectionView.collectionViewLayout invalidateLayout];
return _portraitFlowLayout;
}
我知道这两个布局都是有效的,并且正在工作,因为我正在推动这个viewController形式的另一个viewCont,我试图用横向和纵向布局来做,它工作正常。
当我改变方向时会出现问题。第一个方向更改很好,布局会发生变化。但是当它然后旋转回来时(有时它会在崩溃之前来回旋转几次),当我用仪器中的Zombie模板跟踪它时,它会给我以下错误:
如何进一步追踪此错误?或者,解决问题?任何帮助是极大的赞赏。 提前致谢
修改 只有在旋转到肖像时才会出现问题。
克里斯
答案 0 :(得分:2)
尝试使用UIDeviceOrientationDidChangeNotification而不是willRotateToInterfaceOrientation。
来自Apple的文档:
要支持备用横向界面,您必须执行以下操作:
实现两个视图控制器对象。一个用于呈现仅限纵向的界面,另一个用于呈现仅横向界面。 注册UIDeviceOrientationDidChangeNotification通知。在处理程序方法中,根据当前设备方向显示或关闭备用视图控制器。
- (void)awakeFromNib
{
[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(orientationChanged:)
name:UIDeviceOrientationDidChangeNotification
object:nil];
}
- (void)orientationChanged:(NSNotification *)notification
{
//without selector event may be lost
[self performSelector:@selector(updateFrameWithOrientation) withObject:nil afterDelay:0];
}
-(void) updateFrameWithOrientation{
UIInterfaceOrientation deviceOrientation = [UIApplication sharedApplication].statusBarOrientation;
if (UIDeviceOrientationIsLandscape(deviceOrientation))
{
}
else if (UIDeviceOrientationIsPortrait(deviceOrientation))
{
}
[self.collectionView reloadData];
}