自定义CollectionView布局 - 消息已发送到解除分配的NSDictionary

时间:2014-04-23 17:49:00

标签: ios uicollectionview uicollectionviewlayout nszombie

我无法在两个子类化的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模板跟踪它时,它会给我以下错误:

enter image description here

enter image description here

如何进一步追踪此错误?或者,解决问题?任何帮助是极大的赞赏。 提前致谢

修改 只有在旋转到肖像时才会出现问题。

克里斯

1 个答案:

答案 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];

}