Почему не работает UIView.exclusiveTouch? - PullRequest
13 голосов
/ 09 мая 2009

В одном из моих проектов 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. Я пытался комментировать несколько строк TouchTeNabled, но безрезультатно. Может кто-нибудь объяснить мне, что мне здесь не хватает?

Спасибо, Eli

1 Ответ

18 голосов
/ 14 мая 2009

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

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

По умолчанию для свойства exclusiveTouch представления установлено значение NO. Если вы установите свойство YES, вы помечаете вид, чтобы, если он отслеживает касания, это единственный вид в окне, который отслеживает касания. Другие виды в окне не могут получить эти прикосновения. Тем не менее, вид с пометкой «эксклюзивное прикосновение» не получает прикосновения, которые связаны с другими видами в том же окне. Если палец связывается с эксклюзивным сенсорным просмотром, тогда это касание доставляется только в этот вид - единственный вид, отслеживающий палец в этом окне. Если палец касается неэксклюзивного вида, тогда это прикосновение доставляется только если в эксклюзивном сенсорном изображении нет другого отслеживания пальцев.

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

Чтобы справиться с этим в прошлом, я использую основной вид для отслеживания ВСЕХ ПРИКЛЮЧЕНИЙ на экране, вместо того, чтобы касаться каждой дорожки подпредставления. Лучший способ сделать это:

if(CGRectContainsPoint(thesubviewIcareAbout.frame, theLocationOfTheTouch)){
    //the subview has been touched, do what you want
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...