重新排序旋转的uitableviewcell

3
我有一个uitableview,将其旋转了180度,但其单元格已经向后旋转了-180度。这样做的效果是我从表视图底部加载数据,这很好用。但当我尝试重新排序单元格时,就会遇到问题。如果我尝试拖动一个单元格,它的移动会被反转,并立即跳到表视图的顶部/底部,这取决于我拖动的方向。

最简单的方法是使用主细节模板和核心数据启动一个新项目。在OIMasterViewConroller.m文件中放置:

CGAffineTransform transform = CGAffineTransformMakeRotation(-3.14159);
self.tableView.transform = transform;

在viewDidLoad方法中,放置

CGAffineTransform transform = CGAffineTransformMakeRotation(-3.14159);
cell.transform = transform;

在configureCell方法中。最后,将canMoveRowAtIndexPath更改为返回YES并实现一个空白
-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {

}

运行项目并使用“+”按钮向表格视图添加几项。然后点击编辑按钮并尝试重新排序。

我认为问题出在单元格上,因为如果删除单元格上的旋转,则会停止这种奇怪的行为,即使表格是倒置的。

我考虑过只旋转单元格内部的文本,但是删除按钮也会倒置,并且位于错误的位置。

1个回答

4

因此,我最终对tableview和table view中使用的单元格进行了子类化。以下是我所做的一些事情:

在tableview子类中,我重载了layoutsubviews:

- (void)layoutSubviews
{
    [super layoutSubviews];

    for (UIView *subview in self.subviews) {
        if ([NSStringFromClass([subview class]) isEqualToString:@"UIShadowView"]) {
            subview.hidden = YES;
        }
    }
}

这将去除阴影效果。如果不去除,当表格视图单元格被重新排序时,阴影会显示在其顶部。

对于表格视图单元格子类,我将其layoutSubviews更改为以下内容:

- (void)layoutSubviews
{
    [super layoutSubviews];

      for (UIView *subview in self.subviews) {        
        if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) {
            CGRect newFrame = subview.frame;
            newFrame.origin.x = 0;
            subview.frame = newFrame;
            subview.transform = CGAffineTransformMakeRotation(-M_PI);
        }
        else if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellEditControl"]) {
            CGRect newFrame = subview.frame;
            newFrame.origin.x = 320-newFrame.size.width;
            subview.frame = newFrame;
            subview.transform = CGAffineTransformMakeRotation(-M_PI);
        }
        else if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellReorderControl"]) {
            CGRect newFrame = subview.frame;
            newFrame.origin.x = 0;
            subview.frame = newFrame;
        }else if([NSStringFromClass([subview class]) isEqualToString:@"UIButton"]) {
            CGRect newFrame = subview.frame;
            newFrame.origin.x = 0;
            subview.frame = newFrame;
            subview.transform = CGAffineTransformMakeRotation(-M_PI);
        }else{
            subview.transform = CGAffineTransformMakeRotation(-M_PI);
        }
    }  
}

这会旋转并移动所有的删除按钮/指示器等。需要注意的重要事项是我们不会旋转UITableViewCellReorderControl。旋转这个子视图会导致重新排序混乱。


谢谢您的建议!小提醒:为了更好的精度,请使用M_PI常量而不是-3.14159。 - Christoph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接