Почему UIView.exclusiveTouch не работает?

В одном из моих проектов iPhone у меня есть три вида, которые можно перемещать, касаясь и перетаскивая. Тем не менее, я хочу, чтобы пользователь одновременно перемещал два вида, используя два пальца. Поэтому я старался экспериментировать с UIView.exclusiveTouch без каких-либо успехов.

Чтобы понять, как работает свойство, я создал совершенно новый проект со следующим кодом в контроллере представления:

- (void)loadView {

    self.view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
    UIButton* a = [UIButton buttonWithType:UIButtonTypeInfoDark];
    [a addTarget:self action:@selector(hej:) forControlEvents:UIControlEventTouchUpInside];
    a.center = CGPointMake(50, 50);
    a.multipleTouchEnabled = YES;

    UIButton* b = [UIButton buttonWithType:UIButtonTypeInfoDark];
    [b addTarget:self action:@selector(hej:) forControlEvents:UIControlEventTouchUpInside];
    b.center = CGPointMake(200, 50);
    b.multipleTouchEnabled = YES;

    a.exclusiveTouch = YES;

    [self.view addSubview:a];
    [self.view addSubview:b];

}

- (void)hej:(id)sender
{
    NSLog(@"hej: %@", sender);
}

При выполнении этого hej: получает вызов с разными отправителями при нажатии любой из кнопок - даже если один из них имеет значение exclusiveTouch для YES. Я пробовал комментировать строки multipleTouchEnabled, но безрезультатно. Может кто-нибудь объяснить мне, что мне здесь не хватает?

Спасибо, Eli

Ответы

Ответ 1

Из Руководство по программированию iPhone OS:

Ограничение доставки событий для одного представления:

По умолчанию для свойства views exclusiveTouch установлено значение НЕТ. Если вы установили свойство YES, вы отмечаете представление так, чтобы, если оно отслеживает затрагивает, это единственный вид в окне, отслеживающий касания. Другие виды в окне не могут получить эти штрихи. Однако вид, который отмечен как "эксклюзивный штрих", не получает штрихов, которые связаны с другими представлениями в том же окне. Если палец контакт с эксклюзивным сенсорным представлением, то это касание доставляется только в том случае, если этот вид является единственным видом, отслеживающим палец в этом окне. Если палец касается неэксклюзивного представления, то это касание доставляется только если в режиме эксклюзивного касания нет другого отслеживания пальцев.

В нем указано, что исключительное свойство touch не влияет на касания вне рамки представления.

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

if(CGRectContainsPoint(thesubviewIcareAbout.frame, theLocationOfTheTouch)){
    //the subview has been touched, do what you want
}