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

Posted

技术标签:

【中文标题】使用不可见的 UILabel 并触发 UITextView 事件或不使用 UILabel 并处理 UITextView 点击识别器【英文标题】:Using invisible UILabel and trigger UITextView events or not using the UILabel and handle UITextView tap recognizers 【发布时间】:2012-10-04 22:55:22 【问题描述】:

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

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

关于如何解决这个问题的任何想法?继续使用 A 计划还是 B 计划哪个更好?

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于使用不可见的 UILabel 并触发 UITextView 事件或不使用 UILabel 并处理 UITextView 点击识别器的主要内容,如果未能解决你的问题,请参考以下文章

如何连接 UIButton 和 UIText

UILabel 在圆形自定义 UIView 中不可见

使更改 UILabel 文本不触发自动布局

MapKit 中的中心位置在 UiLabel 中不可见

如何创建带有红色角的 UILabel?

根据实际可见字母高度在 UILabel 中垂直居中文本