iphone / ipad - родительский UIView блокирует прикосновения от попадания в подпредставления - почему? - PullRequest
5 голосов
/ 07 сентября 2010

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

UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0,0,1024,768)];
    self.mainView = myView;
    [myView release];

    [self.view addSubview:self.mainView];

Затем я создаю подпредставления и добавляю их как обычно:

[self.mainView addSubview:someOtherView];

Я знаю, что self.mainView становитсясобытия касания, когда я слушаю в главном окне UIWindow:

VIEW: <UIView: 0x8d34aa0; frame = (0 0; 1024 768);

Но почему в мире я не могу получить подпредставления для получения касаний?Я не понимаю, почему это иногда случается.Я не изменяю никакие стандартные свойства mainView.

Ответы [ 3 ]

15 голосов
/ 10 сентября 2010

Пришлось делать с рамкой родительского вида.Если кадр не охватывает подпредставления, они не получат прикосновения.

12 голосов
/ 02 мая 2012

Прикосновения UIView не передаются подпредставлениям, если они находятся за пределами суперпредставления, как указано в решении.

Однако, если вы хотите, чтобы эти подпредставления реагировали на прикосновения, переопределите hitTest:withEvent: суперпредставления.

Документация по доставке событий

Сенсорные события.Объект окна использует проверку нажатия и цепочку респондента, чтобы найти представление для получения события касания.В тестировании попаданий окно вызывает hitTest: withEvent: в самом верхнем представлении иерархии представлений;этот метод рекурсивно вызывает pointInside: withEvent: для каждого представления в иерархии представлений, которое возвращает YES, продолжая вниз по иерархии, пока не найдет подпредставление, в границах которого произошло касание.Это представление становится представлением проверки нажатия.

  1. Создание подкласса UIView (или другого подкласса UIView).
  2. Переопределение hitTest: withEvent.
  3. Используйте этот подкласс UIView в качестве суперпредставления, чтобы подвид мог реагировать на прикосновения.

Добавить метод ниже в подкласс:

(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    NSEnumerator *reverseE = [self.subviews reverseObjectEnumerator];
    UIView *iSubView;

    while ((iSubView = [reverseE nextObject])) {

        UIView *viewWasHit = [iSubView hitTest:[self convertPoint:point toView:iSubView] withEvent:event];
        if(viewWasHit) {
            return viewWasHit;
        }

    }
    return [super hitTest:point withEvent:event];
}

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

0 голосов
/ 07 сентября 2010

Касаетесь ли вы, что обработчики вызывают обработчики суперкласса?

например. в твоих прикосновениях начался звонок:

[super touchesBegan:touches withEvent:event];
...