У меня есть UIToolbar вверху главного экрана моего приложения для iPad.На нем есть 6 элементов UIBarButton.4 из этих элементов вызывают появление UIPopOvers.Другие 2 элемента либо переключаются на другое представление, либо изменяют что-то в текущем представлении.
3 из 4 UIPopOvers появляются из повернутого UIBarButtonItem, четвертое появляется без стрелки в середине экрана.
Мне бы хотелось получить следующую функциональность, но у меня возникли трудности при ее получении:
- Когда UIPopOvers не отображаются, и пользователь касается одного из UIBarButtonItems, который генерирует UIPopOver, показать, что UIPopOverдовольно просто, все заработало.)
- Когда отображается UIPopOver и пользователь касается UIToolbar, отклонить этот UIPopOver.(Получил эту работу, используя UIGestureRecognizer, который занимает 1 нажатие.)
- Когда отображается UIPopOver и пользователь нажимает UIBarButtonItem, КОТОРЫЙ UIPopOver «TIED», отклоняет UIPopOver.(Вот проблема для меня.)
- Когда отображается UIPopOver, и пользователь касается другого UIBarButtonItem, отклоняет текущий UIPopOver и показывает соответствующий новый.(Это работает нормально.)
Итак, проблема, с которой я сталкиваюсь, заключается в том, что UIGestureRecognizer срабатывает до нажатия кнопки.Я также не могу найти хороший способ «отказаться» от UIGestureRecognizer, когда пользователь нажимает UIBarButtonItem (таким образом, только запускает действие UIGestureRecognizer, когда сам UIToolbar нажат, а не UIBarButtonItem).Конечным результатом этого является то, что когда отображается UIPopOver (из UIBarButtonItem), и пользователь касается того же UIBarButtonItem, UIPopOver отклоняется, а затем снова появляется.
Я пытаюсь избежать некоторыхпроблема с синхронизацией, когда я установил флаг «toolbarTapped» в значение «YES» на 0,10 секунды, а затем снова установил для него значение «NO» (или что-то в этом роде).(а не хак-у).
Кажется, я не могу найти способ определить, когда UIGestureRecognizer был запущен на основе касания UIBarButtonItem, так как UIGestureRecognizer запускается первым, и, похоже, это не очень хорошо.(не частный) способ получить фрейм UIBarButtonItem.
По сути, я пытаюсь заставить UIToolbar и его UIBarButtonItem вести себя так, как ожидал бы любой разумный человек, но я бью себя по голове противстена.
Вот код для UIGestureRecognizer:
// Initialization
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(removeAllPopOvers)];
[tapRecognizer setCancelsTouchesInView:NO];
[tapRecognizer setNumberOfTapsRequired:1];
[tapRecognizer setNumberOfTouchesRequired:1];
[[self Toolbar] addGestureRecognizer:tapRecognizer];
// Tap handler
- (void)removeAllPopOvers {
NSLog(@"removing all popovers");
if ([self firstPopOver]) {
[[self firstPopOver] dismissPopoverAnimated:YES];
[self setFirstPopOver:nil];
}
// and so on with the rest...
}
А вот как отображается один из моих UIPopOvers:
- (IBAction)showSettings:(id)sender {
NSLog(@"settings button tapped");
if (![self SettingsPopOver]) {
SettingsViewController *settingsVC = [[SettingsViewController alloc] initWithNibName:@"SettingsView-iPad" bundle:nil];
UIPopoverController *popOver = [[UIPopoverController alloc] initWithContentViewController:settingsVC];
[popOver setDelegate:self];
[self setSettingsPopOver:popOver];
[[self SettingsPopOver] setPopoverContentSize:CGSizeMake(320, 300)];
[[self SettingsPopOver] presentPopoverFromBarButtonItem:[self Settings] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
}
Чистый эффект всего этого заключается в том, что я могу выбрать один из следующих двух вариантов (но не оба):
- Разрешить UIBarButtonItem отклонить UIPopOver.
- Разрешить касанием UIToolbar отклонить UIPopOver.
Есть идеи?
Спасибо!