Переупорядочивание повернутой ячейки uitableview

У меня есть 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 {

}

Запустите проект и добавьте несколько элементов в табличное представление с помощью кнопки +. Затем нажмите кнопку редактирования и попробуйте изменить порядок.

Я считаю, что проблема заключается в ячейке, поскольку удаление поворота ячейки остановит это странное поведение, даже если таблица перевернута.

Думал просто повернуть текст внутри ячейки, а то кнопки удаления перевернуты, как и не с той стороны.


person Jbryson    schedule 29.12.2012    source источник


Ответы (1)


Итак, в итоге я создал подклассы как для табличного представления, так и для ячейки, используемой в табличном представлении. Вот кое-что из того, что я сделал:

В подклассе tableview я перегружаю layoutsubviews:

- (void)layoutSubviews
{
    [super layoutSubviews];

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

Это уберет тень. Если вы этого не сделаете, тень отображается в верхней части ячеек таблицы, когда они переупорядочиваются.

Для подкласса tableviewcell я изменил его 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);
        }
    }  
}

Это вращает и перемещает все кнопки/индикаторы удаления и т. д. Важно отметить, что мы НЕ вращаем UITableViewCellReorderControll. Вращение этого подпредставления — вот что делает переупорядочивание испорченным.

person Jbryson    schedule 14.02.2013
comment
Спасибо за это, сэр! Небольшое замечание: используйте константу M_PI вместо -3,14159 для большей точности. - person Christoph; 30.04.2013