Когда я добавил жест к подклассу UIScrollView
, у меня возникли проблемы с различными жестами в моем дереве представлений, которые мешают друг другу, такими как возможность щелкнуть по подпредставлениям, прокрутить представление и получить клавиатуру уволить во всех случаях. Я придумал это решение, которое можно настроить из суперкласса UIScrollView
или из UIViewController
.
Класс DismissKeyboardTapGesture
использует ARC, работает с любыми текстовыми полями в представлении и не принимает клики из подпредставлений, таких как кнопки. Также использует эффект прокрутки iOS7, чтобы отклонить клавиатуру.
Настройка из суперкласса UISScrollView:
_dismissKeyboard = [[DismissKeyboardTapGesture alloc] initWithView:self];
или из UIViewController:
_dismissKeyboard = [[DismissKeyboardTapGesture alloc] initWithView:self.view];
Вот класс:
@interface DismissKeyboardTapGesture : NSObject <UIGestureRecognizerDelegate>
@end
@implementation DismissKeyboardTapGesture
- (id)initWithView:(UIView *)view
{
self = [super init];
if (self) {
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)];
singleTap.cancelsTouchesInView = NO;
singleTap.delegate = self;
[view addGestureRecognizer:singleTap];
if ([view respondsToSelector:@selector(setKeyboardDismissMode:)]) {
// Bonus effect to dismiss keyboard by scrolling
((UIScrollView *)view).keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
}
}
return self;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
// Don't stop any existing gestures in our view from working
if (otherGestureRecognizer.view == gestureRecognizer.view) {
return YES;
}
return NO;
}
- (void)singleTap:(UIGestureRecognizer*)gestureRecognizer
{
// Close keyboard for any text edit views that are children of the main view
[gestureRecognizer.view endEditing:YES];
}
@end