Squeak.ru - шаблоны программирования

TouchesBegan не запускается в UIView как подвид UITableViewCell

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

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

Итак, когда я выбираю один из элементов в своем пользовательском представлении, TouchesBegan срабатывает только в той части представления, которая находится над ячейкой UITableView, в которой я вызываю меню, а не во всем представлении, которое я увеличил.

Если я коснусь представления в той части, которая находится над другой ячейкой, TouchesBegan сработает в ячейке табличного представления, а не в представлении поверх всех ячеек.

Любое предложение?


Ответы:


1

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

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

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

  • Переопределить hitTest:withEvent: и pointInside:withEvent как в представлении меню, так и в его суперпредставлении, чтобы информировать ОС о том, что вы реагируете на события даже за пределами ее обычных границ.

07.05.2013
  • У меня есть временное решение с первым решением, которое вы предлагаете. Я пытался переопределить hitTest и pointInsid, но каждый раз, когда я касаюсь представления, которое я увеличил поверх другого меню в другой ячейке, система запускает histTest в представлении под моим увеличенным представлением. 09.05.2013

  • 2

    Для меня работало следующее:

    Подкласс вашей ячейки и соедините корневой вид вашего макета с ячейкой:

    @interface CustomCell : UITableViewCell
    
    @property (weak, nonatomic) IBOutlet UIView *rootView;
    
    @end
    

    Переопределите hitTest ячейки следующим образом:

    @implementation CustomCell
    
    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
        BOOL res = [self.rootView pointInside:point withEvent:event];
        if(res){
            return [self.rootView hitTest:point withEvent:event];
        }
        return [super hitTest:point withEvent:event];
    }
    
    @end
    

    Теперь touchesBegin/Move/End/Cancel будут доставлены в представление и его иерархию всякий раз, когда касание находится внутри этого представления.

    24.11.2016
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...