Как игнорировать прикосновения после смены вида? - PullRequest
0 голосов
/ 28 ноября 2010

У меня есть два вида, основной вид, где я использую CALayers для анимации. Этот основной слой обрабатывает события касания touchsBegan, touchesMoved и touchesEnded.

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

if (infoView == nil) {
    NSArray* nibViews =  [[NSBundle mainBundle] loadNibNamed:@"InfoView" owner:self options:nil];
    infoView = [ nibViews objectAtIndex: 0];
    [infoView retain];
}
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:[self view] cache:YES];
[[self view] addSubview:infoView];
[UIView commitAnimations];

Когда пользователь нажимает кнопку в информационном окне, я возвращаю основной вид на место с помощью ...

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:[self view] cache:YES];
    [infoView removeFromSuperview];
    [UIView commitAnimations];

Проблема, с которой я столкнулся, заключается в том, что, когда я нахожусь в информационном представлении, касания все еще принимаются главным представлением (которое было отключено из поля зрения). Кнопки и текстовые поля в информационном представлении правильно реагируют на прикосновения.

Итак, вопрос в том, как отключить основной вид от получения сенсорных событий, когда информационное представление перевернуто на место?

UPDATE: Кажется, я решил свою проблему, но в процессе создал новую проблему. Я пытаюсь управлять двумя UIVIews с помощью одного UIViewController. Проблема, с которой я столкнулся, заключалась в том, что контроллер основного вида загружал основное представление, и когда я переключал представления, я добавлял информационное представление как подпредставление основного представления. Эта иерархия, по-видимому, приводила к тому, что касания, которые не использовались в видимом информационном представлении, передавались в главное представление.

Я решил эту проблему, заставив контроллер основного вида загрузить представление контейнера. Затем основной вид был загружен как подпредставление контейнера. Когда я перевернул информационное представление, я добавил его как подпредставление контейнера. Неиспользуемые касания, возникающие в информационном представлении, теперь передаются в контейнерное представление, и основное представление их никогда не видит.

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

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2010

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

0 голосов
/ 28 ноября 2010

Рассмотрите возможность представления своего второго представления с использованием presentModalViewController: animated: вместо этого.Вы можете получить эффект переворачивания, и у вас не будет проблем с касаниями, потому что новый контроллер представления будет первым респондентом и обрабатывает все касания автоматически.

например

MyInfoViewController* infoView = [[MyInfoViewController alloc] initWithNibName:@"MyInfoViewController" bundle:nil];
infoView.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:infoView animated:YES];

Вы можете легко создать этот новый контроллер представления и nib-файл с помощью новой команды xcode file (создайте подкласс UIViewController и установите флажок "use nib")

Вы отклоняете контроллер представления, вызывая [self dismissModalViewController]; из основного представленияcontroller.

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

Вы можете взглянуть на проект шаблона для приложения типа Utility в xcode для примера этой точной вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...