Как определить, когда фоновая область коснулась? - PullRequest
0 голосов
/ 01 марта 2011

Я пытаюсь определить, когда пользователь нажимает на какую-то область, отличную от единственного UITextView, который у меня есть на экране.Это похоже на этот вопрос о UITableViews , но у меня есть несколько проблем с представленными там решениями.Когда клавиатура закрыта, я немного прокручиваю экран, чтобы скрыть, где была клавиатура.Моя проблема в том, что когда я использую UITapGestureRecognizer, чтобы определить, было ли нажатие на экран, касание не проходит к другим элементам управления на экране.Я использую gestRecognizer.cancelsTouchesInView = NO, это проблема с синхронизацией.Экран прокручивается до того, как элемент управления распознает, что на него щелкнули.Любая идея, как я могу решить проблему?Я совершенно счастлив, используя что-то кроме распознавания жестов.

Ответы [ 3 ]

2 голосов
/ 01 марта 2011

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

0 голосов
/ 02 марта 2011

Я нашел решение проблемы.Я все еще использую UITapGestureRecognizer, но теперь у меня есть задержка нулевой длины, прежде чем скрывать клавиатуру, что позволяет событию касания правильно распространяться на подпредставления, такие как кнопки.Основной вид - это текстовое поле и кнопки управления, заполняющие экран.Чтобы обеспечить правильное отображение экрана при отображении клавиатуры, все это помещается в представление с прокруткой, а представление заполнителя для области, занимаемой клавиатурой, добавляется в нижнюю часть.Расширяется только тогда, когда отображается клавиатура.Вот все соответствующие фрагменты кода, которые должны позволить любому реализовать идею «нажми куда угодно», а также решить проблему скрытия элементов управления клавиатурой:

- (void)viewDidLoad {
    [super viewDidLoad];
    ...
    UITapGestureRecognizer *tapRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(hideKeyboardWithDelay)] autorelease];
    tapRecognizer.cancelsTouchesInView = NO;
    [self.view addGestureRecognizer: tapRecognizer];
    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyboardWillBeShown:) name: UIKeyboardWillShowNotification object: nil];
    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyboardWillBeHidden:) name: UIKeyboardWillHideNotification object: nil];
}

- (void) hideKeyboardWithDelay {
    // using afterDelay allows the event to go through to any button before scrolling
    [self performSelector: @selector(hideKeyboard) withObject: nil afterDelay: 0.0f];
}

- (void) hideKeyboard {
    [self.myTextField1 resignFirstResponder];
    [self.myTextField2 resignFirstResponder];
}


- (void) keyboardWillBeShown: (NSNotification *) notification {
    NSDictionary* info = [notification userInfo];
    CGSize keyboardSize = [[info objectForKey: UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGRect frame = self.keyboardPlaceholder.frame;
    self.keyboardPlaceholder.frame = CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, keyboardSize.height);
    CGFloat contentHeight = self.scrollView.contentSize.height + keyboardSize.height + 20; // in my case, save 20px for the status bar
    self.scrollView.contentSize = CGSizeMake(frame.size.width, contentHeight);
    [self.scrollView scrollRectToVisible: self.keyboardPlaceholder.frame animated: YES];
}

- (void) keyboardWillBeHidden: (NSNotification *) notification {
    CGRect frame = self.keyboardPlaceholder.frame;
    NSDictionary* info = [notification userInfo];
    NSValue* value = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    NSTimeInterval duration = 0.3f; // default keyboard animation time
    [value getValue: &duration];

    [UIView beginAnimations: @"hideKeyboardAnimation" context: nil];
    [UIView setAnimationDuration: duration];
    [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut];

    self.keyboardPlaceholder.frame = CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, 0);   
    self.scrollView.contentSize = self.view.frame.size;

    [UIView commitAnimations]; 
}

- (void)viewDidUnload { 
    [[NSNotificationCenter defaultCenter] removeObserver: self];
    [super viewDidUnload];
}

Надеждакто-то находит это полезным.

0 голосов
/ 01 марта 2011

Сохранить распознаватель жестов.Пусть он использует такой метод:

- (void)dismissKeyboard:(UIGestureRecognizer *)gesture
{
    [self.view endEditing:NO];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...