Хобрук: Ваш путь к мастерству в программировании

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

Я использую UIPanGestureRecognizer, чтобы мой UITableView можно было перетаскивать. В настоящее время я установил его так, что UITableView нельзя перетащить за 0 или половину его ширины. Но теперь его кадр устанавливается на 0, когда я пытаюсь перетащить UITableView обратно в 0 из исходной точки больше 0. Как я могу предотвратить это и разрешить перетаскивание UITableView обратно в 0? Я пробовал следующее, но я не могу понять, почему это вызвано изложенным кодом.

- (void) handlePan:(UIPanGestureRecognizer *) pan {

    CGPoint point = [pan translationInView:_tableView];

    CGRect frame = [_tableView frame];

    if (point.x <= _tableView.frame.size.width / 2) {
        frame.origin.x = point.x;
    }

    NSLog(@"%f : %f", frame.origin.x, _tableView.frame.origin.x);
    //outline begin!
    if (frame.origin.x < 0 && _tableView.frame.origin.x >= 0) {
        frame.origin.x = 0;
    }
    //outline end!
    isFilterViewShowing = frame.origin.x > 0;

    [_tableView setFrame:frame];

}

Ответы:


1

Это не самый красивый код, но он работает в симуляторе.
Чтобы этот код работал, вам нужно добавить переменную экземпляра.
Этот код может вести себя не совсем так, как вы хотите, потому что он отслеживает «отрицательная» позиция x, поэтому вы получаете некоторый «пороговый» эффект, который вам может не понадобиться в зависимости от вашего выбора дизайна.

- (void) handlePan:(UIPanGestureRecognizer *) pan {

if (pan.state == UIGestureRecognizerStateBegan)
{
    //  cache the starting point of your tableView in an instance variable
    xStarter = _tableView.frame.origin.x;
}

// What is the translation
CGPoint translation = [pan translationInView:self.tableView];
//  Where does it get us
CGFloat newX = xStarter + translation.x;

CGFloat xLimit = self.tableView.superview.bounds.size.width / 2;

if (newX >= 0.0f && newX <= xLimit)
{
    //  newX is good, don't touch it
}
else if (newX < 0)
{
    newX = 0;
}
else if (newX > xLimit)
{
    newX = xLimit;
}

CGRect frame = self.tableView.frame;
frame.origin.x = newX;

[_tableView setFrame:frame];

if (pan.state == UIGestureRecognizerStateEnded)
{
    //  reset your starter cache
    xStarter = 0;
}
}

Вы заметили, что [pan translationInView:aView]; возвращает смещение pan gesture, а не положение пальца на экране.
Вот почему ваш код работает не так, как вы ожидаете.

04.12.2011
  • Это на самом деле не помогло, я пробовал использовать superView, но никаких касаний не было обнаружено. Вы понимаете, почему мой код не работает? 05.12.2011
  • не ищите касания в вашем superView, пусть pan вернет перевод CGPoint в систему координат superView. 05.12.2011
  • можете ли вы привести пример, пожалуйста? 05.12.2011
  • хорошо, я все еще получаю сообщение об ошибке, у вас есть ответ на мою проблему в ОП? 05.12.2011
  • Это ошибка, описанная в ОП. Я не могу смахнуть таблицу назад влево, так как ее origin.x сразу же устанавливается на 0, уже смахнув ее вправо. Вот пример ошибки: cl.ly/3M2O0Q2P2E1V3G3N1v1k. 05.12.2011
  • Работает блестяще! Большое спасибо! Я только что закодировал это, и, похоже, это сработало, но не совсем так, как у вас - gist.github.com/1434371 05.12.2011
  • @max_ мое решение не идеально, поскольку я сказал, что в нем есть недостаток, который вы, вероятно, захотите исправить. 05.12.2011
  • Если вы применяете жест панорамирования к tableView, прокрутка не работает. Вы знаете какой-нибудь способ обойти это? 16.03.2012
  • Новые материалы

    Получение стоковых обновлений с помощью Python
    Для начинающего финансового аналитика Введение Описание: Этот проект Python создает скрипт для получения текущих обновлений акций с финансового веб-сайта Yahoo. Для этого проекта мы..

    Это все, что вам нужно знать о Kotlin в 2022 году
    Добро пожаловать! Kotlin — это язык программирования, популярность которого, кажется, растет, его действительно можно использовать для создания чего угодно, и если вы хотите узнать о Kotlin,..

    Текстовый графический интерфейс с Lanterna на Java
    Мой опыт работы с компьютерами (и текстовыми графическими пользовательскими интерфейсами) начался еще в восьмидесятых, когда я был ребенком, на дне рождения друга. Это был «новенький» Amstrad..

    Перезарядите свой мозг: умопомрачительный потенциал мозговых компьютерных интерфейсов
    Способность читать свои мысли и управлять объектами разумом долгое время были предметом человеческого любопытства, ограниченного областью научной фантастики… то есть до сих пор? С технологией,..

    Основы C# — Нулевой оператор объединения (??)
    Оператор ?? называется null-coalescing operator . Этот оператор используется для предоставления значения по умолчанию, если значение операнда в левой части оператора равно null ...

    Сравнение номеров версий в C++ с использованием синтаксического анализа строк
    Номера версий обычно используются для обозначения развития или обновлений программного обеспечения или любого другого продукта. При работе с номерами версий в C++ может быть полезно сравнить две..

    В мир искусственного интеллекта…
    ИИ — это новое топливо в современном мире. Куда бы вы ни обратились, с кем бы вы ни разговаривали — они, как правило, упоминают об ИИ хотя бы раз в ходе разговора. ИИ гудит повсюду. У каждого..