Използване на невидими 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 (след като текстът е променен и лентата с менюта е скрита) трябва отново да задейства видимостта на лентата с менюта. В такъв случай бих добавил код вътре в singleTapRecognized, така че да се покаже отново, но по някаква причина UITapGestureRecognizer singleTap спира да работи и следователно методът singleTapRecognized вече не се задейства. Така че започнах с план B:

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

Някакви идеи как да се реши това? Кое е по-добре да продължите да работите, план А или Б?


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


Отговори (1)


Мисля, че бих преминал към план C. Ако регистрирате свойството gestureRecognizers на текстовия изглед, ще видите, че има куп от тях, така че забъркването с тях изглежда изпълнено с трудности. Обикновено второто докосване върху текстовия изглед променя селекцията (или извежда изскачащия прозорец на заместващия текст) и извиква метода textViewDidChangeSelection: -- бих използвал този метод и ще проверя дали лентата с менюта е скрита или не -- ако това е, върнете го обратно и след това извикайте super textViewDidChangeSelection: за да позволите на текстовия изглед да свърши работата си.

person rdelmar    schedule 05.10.2012