Перетаскивание UITableView

Я работаю над приложением для iPhone, где я хочу перетащить представление таблицы (а не ячейки) до определенной точки на экране. У меня есть табличное представление, сидящее в нижней половине экрана, и у меня есть изображение в верхней половине.

Когда я прокручиваю таблицу, чтобы увидеть строки ниже, таблица должна на самом деле двигаться вверх над изображением (y pos уменьшается, а высота увеличивается). Таблица будет подниматься до тех пор, пока не заполнит весь экран, оставляя несколько пикселей для изображения, и она закрепится там, и с этого момента таблица должна прокручиваться. Такое же поведение ожидается и для прокрутки вниз.

Это может звучать немного странно, но это новый шаблон iOS, которыйпоявляется.

Мне удалось сделать первую часть, используя фрагмент кода ниже.

UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanForScrollView:)];
panGestureRecognizer.maximumNumberOfTouches = 1;
panGestureRecognizer.delegate = self;
panGestureRecognizer.minimumNumberOfTouches = 1;
[self.tableView addGestureRecognizer:panGestureRecognizer];

- (void)handlePanForScrollView:(UIPanGestureRecognizer *)gesture {
    switch (gesture.state) {
        case UIGestureRecognizerStateBegan:
            break;
        case UIGestureRecognizerStateChanged: {

            CGPoint movement = [gesture translationInView:self.view];
            CGRect frame = self.tableView.frame;
            frame.origin.y += movement.y;
            if(frame.origin.y >= Y_OFFSET && frame.origin.y < self.original_frame.origin.y){
                frame.size.height -= movement.y;
                self.tableView.frame = frame;
                [gesture setTranslation:CGPointZero inView:self.view];
            }
            break;
        }
        case UIGestureRecognizerStateEnded:
        case UIGestureRecognizerStateCancelled:{
            //NSLog(@"End");
            break;
        }
        default:
            ;
            break;
    }
}

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

Вот и я попробовал это

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    if(self.tableView.frame.origin.y = self.original_frame.origin.y){
        NSLog(@"Here");
        return YES;
    }   
    return NO;
}

Вот" сообщение выводится на консоль, но таблица нет прокрутка.

Я даже попытался использовать panGestureRecognizer для UITableView вместо моего UIPanGestureRecognizer.

self.tableView.panGestureRecognizer addTarget:self action:@selector(handlePanForScrollView:)

Но теперь стол прокручивается и двигается вверх ».

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

Какие'лучший способ справиться с этим?

ура

 Mar0ux01 июн. 2013 г., 09:13
Вы не возвращаете неправильное значение вshouldRecognizeSimultaneouslyWithGestureRecognizer? Так должно бытьreturn NO; когда табличное представление пристыковано. Я что-то пропустил?
 Jugs01 июн. 2013 г., 09:58
Изменение значений (ДА / НЕТ) нене имеет значения

Ответы на вопрос(3)

Если я правильно понимаю вопрос, самое простое решение - программно установить заголовок tableView на желаемое изображение. (Я думаю, что это похоже на то, что делает Path для установки местоположения, за исключением того, что они используют карту, а не изображение.)

UIImage *image = [UIImage imageNamed:@"image_name"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[self.tableView setTableHeaderView:imageView];

Это эквивалентно перетаскиванию UIImageView с соответствующим изображением в заголовок tableView в раскадровке.

Обратите внимание: вид заголовка таблицы отличается от заголовка раздела. УвидетьДокументация для получения дополнительной информации.

Решение Вопроса

Я думаю, как тыделать это хорошо. Вам просто нужно помешать UIGestureRecognizer обрабатывать больше касаний после определенного момента. Так что я бы сделал (с наименьшим количеством изменений в существующем коде) просто переопределив функцию делегата:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

В этой функции проанализируйте положение табличного представления и, если оно уже достигло определенной высоты, верните NO. Это остановит UIPanGestureRecognizer от принятия события касания и передаст его вверх по цепочке, которая должна перейти прямо к UIScrollView табличного представления.

Альтернатива, если бы у меня было время, чтобы выяснить это, я бы попытался сделать это с изображением в виде таблицы.s заголовок (self.tableView.tableHeaderView). Таким образом, вся прокрутка выполняется в представлении прокрутки таблицы и таблицы.кадр ненужно двигаться. Если вы хотите добавить некоторые интересные эффекты в tableHeaderView, вы всегда можете переопределить функцию UIScrollViewDelegate- (void)scrollViewDidScroll:(UIScrollView *)scrollView и слегка сдвиньте изображение в заголовке, когда таблица прокручивает начальную половину экрана (это тот же эффект, что и Path). Тем не менее, это нене позволяет вам привязать изображение в самой верхней части табличного представления ... все изображение будет прокручиваться. Просто мои 2 цента. :)

 Jugs03 июн. 2013 г., 10:05
Я пытался со всеми представлениями, но все еще speed.y равен 0.0 :( После того, как я пристыковываю табличное представление к вершине, мне придется перемещать его вниз, когда пользователь прокручивает вниз, и, следовательно, мне нужно знать, происходит ли прокрутка вверх или вниз . Любые другие предложения, приятель?
 Mr. T03 июн. 2013 г., 05:51
Хм, этокак я это делаю Тем не менее, попробуйте это, в вашем вызове, передать в таблицес супервью Так что-то вроде: CGPoint speed = [(UIPanGestureRecognizer *) sender speedInView: self.tableView.superview]. Я думаю, что у меня была проблема в прошлом, когда я перешел в представлении в speedInView, и это нене работает правильно ... Не уверен, если этос чемЭто сбивает вас с толку, но стоит попробовать. Удачи!
 Jugs01 июн. 2013 г., 09:21
Спасибо, мистер Т! Я пойду с вашим предложением и посмотрю, решит ли это проблему ..
 ColinMasters12 нояб. 2014 г., 16:29
Кувшины, если бы у вас все получилось, не могли бы вы опубликовать готовый фрагмент кода? Я'У меня такая же проблема, и я хотел бы увидеть рабочую версию!
 Jugs01 июн. 2013 г., 09:26
Это решило мою проблему! Wohoo!
 Mr. T03 июн. 2013 г., 11:03
Это действительно должно работать. Можете ли вы вставить свой код handleRecognizer в качестве редактирования ваших вопросов выше?
 Jugs03 июн. 2013 г., 13:07
Проблема с этим подходом заключается в том, что когда таблица закреплена сверху, обработчик shouldReceiveTouch вернет NO, чтобы таблица прокручивалась. И когда он возвращает НЕТ, handlePanRecognizer выигралне быть призван. Так что я'Я пытаюсь найти направление прокрутки от обработчика shouldReceiveTouch, и если направление вниз, то я верну НЕТ и перетащу табу. Если оно's вверх, я верну ДА и таблица будет прокручиваться. Надеюсь, это имеет смысл.
 Jugs03 июн. 2013 г., 18:11
Я закончил с использованием UITableView panGestureRecognizer и сделал несколько изменений в функции handlePan.не идеально, но выглядит хорошо для этого выпуска. Ваш ответ был очень близок к решению моей проблемы, и поэтому яЯ принимаю ваш ответ. Спасибо за ваше время, приятель! Ура!
 Jugs01 июн. 2013 г., 09:30
Еще один быстрый вопрос @Mr. T - Есть ли в любом случае я получу скорость (чтобы я мог определить, был ли удар вверх или вниз) в методе shouldReceiveTouch? Я пробовал speedInView и проверил speed.y, но он всегда возвращает 0.0
 Mr. T03 июн. 2013 г., 11:06
Я разделил логику, чтобы вычислить вещи вИзменено» государство против "Закончилось» изложить по-другому. Когда состояние панорамирования изменилось, я считаю, что перетаскиваю и вычисляю движение на основе [(UIPanGestureRecognizer *) отправителя translationInView: self.tableView.superview]. Когда состояние панорамы закончилось, я считаю, что бросок, и я рассчитываю движение на основе направления + скорость, используя SpeedInView. Если оно'с "тащить, тянуть" состояние, попробуйте использовать translationInView вместо speedInView ... Я думаю, что этоЭто более полезный показатель. Но независимо, вставьте код выше.

Можете ли вы попробовать этот код для перемещения таблицы

   [UIView animateWithDuration:1.5 animations:^
     {
         //ADD CODES HERE FOR STARTING STATE (FRAME FOR UITABLEVIEW )
        // eg: table.frame=CGRectMake(0,320,320,200);   tableview lying on bottom of viewcontroller with 200px height 


     } completion:^(BOOL finished)
     {


        // ADD CODES HERE  TO MAKE YOUR FINAL FRAME OF UITABLEVIEW
         // eg: table.frame=CGRectMake(0,0,320,200);   tableview moving to top of viewcontroller with 200px height



     }];

попробуйте это, дайте мне знать результаты

ПОЖАЛУЙСТА, ДО МАРКИРОВКИ ВНИЗ, ГОЛОСОВАТЬ, ДАЙ МНЕ ЗНАЙТЕ ПРИЧИНУ, ПОТОМУ ЧТО ЭТОТ КОДЕКС РАБОТАЕТ ДЛЯ МЕНЯ

 Jugs01 июн. 2013 г., 08:41
Благодарим Вас за чтение вопроса еще раз. Я'я не борюсь с движением стола, но "Я хочу, чтобы таблица не прокручивалась, а двигалась до определенной точки на экране, а затем перестала двигаться и начала прокручиваться ».
 Navi01 июн. 2013 г., 08:44
ДА бро тут табличка не будет прокручиваться, поверь он просто перемещает высоту таблицы 200px снизу вверх. если вы хотите прокрутить анимацию вблок завершения " добавить коды для перехода к определенному индексу таблицы
 Navi01 июн. 2013 г., 08:39
он будет медленно перемещать uitableview на вершину, если вы хотите быстро сократить это время
 Jugs01 июн. 2013 г., 08:38
Это победилоне имеет большого значения, яЯ боюсь, за исключением того, что он будет перемещать стол с хорошей анимацией и 1,5 с довольно долго.

Ваш ответ на вопрос