Использование невидимого UILabel и запуск событий UITextView или неиспользование UILabel и обработка распознавателей касаний UITextView

A) Сначала я расскажу, как я пытаюсь решить эту проблему БЕЗ использования невидимого UILabel

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

  UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapRecognized:)];
  [singleTap setNumberOfTapsRequired:1];
  [TextView addGestureRecognizer:singleTap];
  [TextView setUserInteractionEnabled:YES];
  [singleTap release];

-(IBAction)singleTapRecognized:(id)sender
    {
      [TextView becomeFirstResponder];
    }

2) При изменении текста строка меню должна быть скрыта. Это не создает никаких проблем, потому что нужно всего лишь добавить код внутри TextViewDidChange:

- (void)textViewDidChange:(UITextView *)textView
{
  if (bTitleBar)
  {
    bTitleBar = NO;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.30f];
    menuBar.transform =
    CGAffineTransformMakeTranslation(
                                     menuBar.frame.origin.x,
                                     -50 
                                     );

    CGRect newFrameSize;
    currentOrientation = [UIApplication sharedApplication].statusBarOrientation;
    if (currentOrientation==UIInterfaceOrientationPortrait ||currentOrientation==UIInterfaceOrientationPortraitUpsideDown)
    {
      newFrameSize = CGRectMake(96, 0, txtMain.frame.size.width, 605);
    }
    else
    {
      newFrameSize = CGRectMake(96, 0, txtMain.frame.size.width, 270);
    }
    textView.frame = newFrameSize;
    [UIView setAnimationDuration:0];
  }
}

3) Следующее нажатие на UITextView (после изменения текста и скрытия MenuBar) должно снова вызвать видимость строки меню. В этом случае я бы добавил код внутри singleTapRecognized, чтобы он отображался снова, но по какой-то причине singleTap UITapGestureRecognizer перестает работать, и, следовательно, метод singleTapRecognized больше не запускается. Итак, я начал с плана Б:

B) Решение, которое я пробовал, состояло в том, чтобы использовать невидимый UILabel, который я прикрепил визуально (а не программно) поверх UITextView. Я также сделал соответствующий ему IBOutlet и настроил ссылку. Теперь singleTap UIGestureRecognizer добавляется в UILabel, а не в UITextView. Проблема в том, что UITextView нельзя прокрутить или коснуться, потому что UILabel НАД ним и становится препятствием.

Любые идеи о том, как решить эту проблему? С каким планом лучше продолжить работу, с планом А или Б?


person Laureano Bonilla    schedule 04.10.2012    source источник


Ответы (1)


Я думаю, что я бы пошел по плану C. Если вы зарегистрируете свойствоgestRecognizers текстового представления, вы увидите, что их много, поэтому возиться с ними кажется сопряженным с трудностями. Обычно второе нажатие на текстовом представлении изменяет выделение (или вызывает всплывающее окно замены текста) и вызывает метод textViewDidChangeSelection: -- я бы использовал этот метод и проверил, скрыта ли строка меню или нет -- если это так, верните его, а затем вызовите super textViewDidChangeSelection: чтобы позволить текстовому представлению делать свое дело.

person rdelmar    schedule 05.10.2012