Сдвиньте часть ячейки табличного представления с помощью панорамирования

#ios #objective-c #cocoa-touch #uitableview

#iOS #objective-c #cocoa-touch #uitableview

Вопрос:

У меня есть таблица с пользовательскими ячейками из файла NIB. Результат должен выглядеть так, что я собираюсь захватить ячейку и убрать ее с экрана. ПРИМЕЧАНИЕ: только часть ячейки. Другая часть останется. У меня возникла проблема с выполнением перемещения панорамирования в ячейке. NSLog регистрирует движение правильно, но я не могу перемещаться вместе с ячейкой. Мой cell.m выглядит так:

 #import "MIKETableViewCell.h"

static NSString *CellTableIdentifier = @"MIKETableViewCell";

@implementation MIKETableViewCell

@synthesize timeLabel = _timeLabel;
@synthesize priceLabel = _priceLabel;
@synthesize infoLabel = _infoLabel;


- (void)awakeFromNib
{
    // Initialization code
}


-(void)layoutSubviews
{
    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureRecognizer)];

    [self addGestureRecognizer:panGesture];
}


-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {

    self = [super initWithStyle:style reuseIdentifier:CellTableIdentifier];

    return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

   // Configure the view for the selected state
}

-(void)panGestureRecognizer
{

    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureRecognizer)];
    NSLog(@"Panned!");

    CGPoint translation = [panGesture translationInView:self];
    panGesture.view.center = CGPointMake(panGesture.view.center.x   translation.x,
                                     panGesture.view.center.y   translation.y);

}

@end
  

Спасибо за любой ответ!

Ответ №1:

Ваш код для перемещения вашего представления неверен. Распознаватель жестов панорамирования выдает значения, которые начинаются с 0 от точки, к которой пользователь впервые прикасается, и непрерывно увеличиваются по мере удаления пользователя от этой точки.

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

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

Представьте, что пользователь нажимает на (100, 100), а затем перетаскивает вниз и вправо оттуда. Сначала вызывается перевод ( 5, 5), затем ( 10, 10), затем ( 15, 15), затем ( 20, 20) и так далее, вплоть до ( 100, 100). Это означает, что пользователь перетаскивает представление на 100 пунктов вправо и на 100 пунктов вниз. Однако сначала вы добавили (5,5) в центр, затем (10,10), затем (15,15) и т.д. К тому времени, когда палец пользователя дойдет до (200,200), вы добавили во много раз больше, чем ( 100, 100) изменения, которые пользователь фактически внес в центральное положение.

В вашем коде вы можете исправить это, добавив одну строку:

-(void) panGestureRecognizer: (UIPanGestureRecognizer *) отправитель

 {
    CGPoint translation = [sender translationInView:self];

    //log the translation so you can see if it's working
    NSLog(@"Panned with translation point: %@", NSStringFromCGPoint(translation));

    sender.view.center = CGPointMake(sender.view.center.x   translation.x,
                                 sender.view.center.y   translation.y);

    //-------------------------------------------------------
    //---below is the line you need to add to zero out the translation.---
    [sender setTranslation: CGPointZero inView: self];
    //-------------------------------------------------------

}
  

Комментарии:

1. Ах, я понял, большое вам спасибо за отличный ответ, теперь я это понимаю! Спасибо!

Ответ №2:

Ваша проблема может заключаться в том, что вы воссоздаете panGesture внутри -panGestureRecognizer метода. Из-за этого метод, panGesture который вы используете внутри метода распознавания, отличается UIPanGestureRecognizer от метода, вызывающего метод, поэтому [panGesture translationInView:self] может не возвращать правильное значение. попробуйте это:

 -(void)panGestureRecognizer:(UIPanGestureRecognizer *)sender{
    CGPoint translation = [sender translationInView:self];

    //log the translation so you can see if it's working
    NSLog(@"Panned with translation point: %@", NSStringFromCGPoint(translation));

    sender.view.center = CGPointMake(sender.view.center.x   translation.x,
                                 sender.view.center.y   translation.y);
}
  

Таким образом, sender UIPanGestureRecognizer вызывается метод вместо нового, пустого, который вы создаете в методе.

Чтобы это сработало, вам также придется изменить первую строку в вашем -layoutSubviews методе на UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureRecognizer:)]; . Обратите внимание, что единственное, что изменилось, это добавленное двоеточие в @selector(panGestureRecognizer:) This, потому что ваш метод выбора теперь имеет параметр sender .

Комментарии:

1. Отличный ответ! Большое вам спасибо, вы чемпион! Но есть проблема (конечно). Движение не является плавным, я бы сказал, что оно в два раза быстрее, и в результате вид прыгает по всему экрану.