UIView, его суперпредставление и прикосновения начались: - PullRequest
5 голосов
/ 07 февраля 2011

Предположим, у меня есть подкласс UIViewController, который заботится о некоторых UIViews. Эти UIViews добавляются как подпредставления свойства view UIViewController):

UIViewController:

- (void)viewDidLoad {
    UIImageView *smallImageView...
    [self.view addSubview:smallImageView];

    UIButton *button..
    [self.view addSubview:button];

    UIView *bigUIView.. // covers the entire screen (frame = (0.0, 0.0, 1024.0, 768.0))
    [self.view addSubview:bigUIView];
...
}

AFAIK, поскольку bigUIView является самым передним видом и охватывает весь экран, он получит touchesBegan:withEvent:, а другие виды, например button, не получат никакого сенсорного события.

В моем приложении bigUIView должно быть самым верхним представлением, поскольку оно содержит основные объекты пользовательского интерфейса (фактически, CALayers, основные игровые объекты), которые при анимации должны быть поверх всех других вторичных элементов пользовательского интерфейса (UIButtons так далее). Однако я хотел бы иметь возможность иметь кнопки UIB и другие объекты в цепочке ответчика.

Я попытался реализовать следующее в bigUIView классе:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {    
    [self.superview touchesBegan:touches withEvent:event];

    ... hit test the touch for this specific uiview..
}

Примечания:

  1. bigUIView относится к свойству view UIViewController, распространяет ли оно событие касания на все его подпредставления?
  2. bigUIView должен иметь userInteractionEnabled = YES, поскольку он также обрабатывает пользовательский ввод.
  3. Я не могу вывести button / smallImageView на передний план, потому что он появится над основными игровыми объектами (подуровнями bigUIView).

Заранее спасибо.

Ответы [ 2 ]

11 голосов
/ 07 февраля 2011

Попробуйте переопределить pointInside:withEvent: в классе bigUIView, чтобы получить NO, если точка находится внутри прямоугольника рамки одного из других подпредставлений фонового представления.Так как эти другие представления являются родственными, механизм тестирования попаданий продолжит тестировать другие подпредставления и находит тот, который соответствует точке, к которой прикоснулся пользователь.

Alos, рассмотрите возможность реализации методов фазы события (-touchesBegan:withEvent:,и т.д.) в вашем подклассе UIViewController, а не в классе bigUIView.iOS вставляет контроллеры представления за их представлениями в цепочку респондента, поэтому сообщения о событиях будут пузыриться до контроллера представления, если одно из других подпредставлений (например, кнопка) не перехватит его.Затем контроллер представления может отправлять любые сообщения, которые вам нравятся, в любое из его представлений.

0 голосов
/ 07 февраля 2011

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

...