使用不可见的UILabel并触发UITextView事件或不使用UILabel并处理UITextView点击识别器

时间:2012-10-04 22:55:22

标签: objective-c uitextview uitapgesturerecognizer

A)首先,我将揭露我试图解决这个问题的方式,而不使用隐形UILabel

1)首次点击UITextView使其成为First Responder。这将是默认行为(不需要为此添加代码)但由于点击识别器应该稍后触发其他操作,因此还需要创建个性化的点击识别器:

  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中添加代码,以便再次显示,但由于某种原因,UITapGestureRecognizer singleTap停止工作,因此不再触发singleTapRecognized方法。所以我从B计划开始:

B)我尝试的解决方案是使用一个不可见的UILabel,我在UITextView上以可视方式(非编程方式)附加。我还制作了相应的IBOutlet并设置了参考。现在UIGestureRecognizer singleTap被添加到UILabel而不是UITextView。 问题是UITextView无法滚动或点击,因为UILabel已经超过它并成为障碍。

如何解决这个问题?哪个更好继续使用A或B计划?

1 个答案:

答案 0 :(得分:0)

我想我会去计划C.如果你记录文本视图的gestureRecognizers属性,你会看到它们中有很多,所以弄乱它们似乎充满了困难。通常,文本视图上的第二次点击会更改选择(或调出替换文本弹出窗口)并调用textViewDidChangeSelection:方法 - 我会使用该方法,并检查菜单栏是否隐藏 - 如果它是,把它带回来然后调用super textViewDidChangeSelection:允许文本视图做它的事情。