旋转后无法选择表格单元格

时间:2013-12-22 10:50:13

标签: ios objective-c uitableview tableview autosize

我的视图应该在纵向和横向模式下具有不同的布局。我实现了一个方法来重绘我的UI元素与自动调整大小(没有AutoLayout):

-(void)buildViewElements:(UIInterfaceOrientationMask)interfaceOrientation duration:(NSTimeInterval)duration {
if (interfaceOrientation == UIInterfaceOrientationMaskPortrait) {
    NSLog(@"Portrait");

    [UIView animateWithDuration:duration animations:^{
        CGRect newImageFrame = CGRectMake(20, 15, 100, 100);
        _personImage.frame   = newImageFrame;
        CGRect newNameLabelFrame = CGRectMake(128, 20, 172, 21);
        _nameLabel.frame = newNameLabelFrame;
        CGRect newNameDescFrame = CGRectMake(128, 41, 172, 21);
        _nameDescriptionLabel.frame = newNameDescFrame;
        CGRect newBorrowedFrame = CGRectMake(128, 64, 75, 21);
        _borrowedLabel.frame = newBorrowedFrame;
        CGRect newBorrowedValueFrame = CGRectMake(211, 64, 42, 21);
        _borrowedValueLabel.frame = newBorrowedValueFrame;
        CGRect newLendFrame = CGRectMake(128, 93, 75, 21);
        _lendLabel.frame = newLendFrame;
        CGRect newLendValueFrame = CGRectMake(211, 93, 42, 21);
        _lendValueLabel.frame = newLendValueFrame;

        CGRect newcontainerFrame = CGRectMake(0, 130, 320, [CNX_Tools getLargestAttributeOfSize:[[UIScreen mainScreen] bounds].size] - 194);
        _tableContainerView.frame = newcontainerFrame;
        CGRect newDetailFrame = CGRectMake(20, 0, 280, 29);
        _detailSelector.frame = newDetailFrame;
        CGRect newTableFrame = CGRectMake(0, 36, 320, newcontainerFrame.size.height - 39);
        _tableView.frame = newTableFrame;
    }];
}
else if (interfaceOrientation == UIInterfaceOrientationMaskLandscape) {
    NSLog(@"Landscape");

    [UIView animateWithDuration:duration animations:^{
        CGFloat factor = 1.0f;
        CGFloat diff   = 0.0f;
        if ([CNX_Tools getLargestAttributeOfSize:[[UIScreen mainScreen] bounds].size] <= 480) {
            // iPhone4 size
            factor =  0.8f;
            diff   = 10.0f;
        }

        CGRect newImageFrame = CGRectMake(75*factor-diff, 20, 100, 100);
        _personImage.frame = newImageFrame;
        NSLog(@"Bild Frame %f", newImageFrame.origin.x);
        CGRect newNameLabelFrame = CGRectMake(20, 140, 210*factor, 21);
        _nameLabel.frame = newNameLabelFrame;
        CGRect newNameDescFrame = CGRectMake(20, 161, 210*factor, 21);
        _nameDescriptionLabel.frame = newNameDescFrame;
        CGRect newBorrowedFrame = CGRectMake(20, 184, 75, 21);
        _borrowedLabel.frame = newBorrowedFrame;
        CGRect newBorrowedValueFrame = CGRectMake(103, 184, 42, 21);
        _borrowedValueLabel.frame = newBorrowedValueFrame;
        CGRect newLendFrame = CGRectMake(20, 213, 75, 21);
        _lendLabel.frame = newLendFrame;
        CGRect newLendValueFrame = CGRectMake(103, 213, 42, 21);
        _lendValueLabel.frame = newLendValueFrame;

        CGRect newContainerFrame = CGRectMake(250*factor, 0, [CNX_Tools getLargestAttributeOfSize:[[UIScreen mainScreen] bounds].size] - 250*factor, 268);
        _tableContainerView.frame = newContainerFrame;
        CGRect newDetailFrame = CGRectMake(20, 10, newContainerFrame.size.width - 40 , 29);
        _detailSelector.frame = newDetailFrame;
        CGRect newTableFrame = CGRectMake(0, 49, newContainerFrame.size.width, 219);
        _tableView.frame = newTableFrame;
    }];
}

}

从方法调用此方法:

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {

switch (toInterfaceOrientation) {
    case UIInterfaceOrientationPortrait:
        [self buildViewElements:UIInterfaceOrientationMaskPortrait duration:duration];
        break;
    case UIInterfaceOrientationPortraitUpsideDown:
        [self buildViewElements:UIInterfaceOrientationMaskPortrait duration:duration];
        break;
    case UIInterfaceOrientationLandscapeLeft:
        [self buildViewElements:UIInterfaceOrientationMaskLandscape duration:duration];
        break;
    case UIInterfaceOrientationLandscapeRight:
        [self buildViewElements:UIInterfaceOrientationMaskLandscape duration:duration];
        break;
    default:
        break;
}

}

方法getLargestAttributeOfSize:返回最大的size属性(height或width)。

如果我以纵向方式启动视图,我可以调用表格单元格和方法tableView:didSelectRowAtIndexPath:被调用。旋转到横向模式后,所有单元格都不可选,我无法在表格中滚动。但是,如果我放下这个屏幕并再次调用ist(在横向模式下),可以选择相同的表格单元格,调用该方法,我可以在桌子上漫步。如果我将设备旋转为纵向,我会有同样的错误行为。旋转设备后,我无法与我的桌子及其单元进行交互。

有人可以帮助我,或者知道我的问题在哪里? 谢谢!

1 个答案:

答案 0 :(得分:1)

我的猜测是,UITableView的超级视图未正确调整。输入可能永远不会到达您的UITableView,但是当它开始时,一切都很好。可能是您UIViewController的视图。

尝试将clipsToBounds:YES设置为超级视图,以查看您的tableView是否实际上超出了视图范围。