【问题标题】:How to mask out a view when filling an area?填充区域时如何掩盖视图?
【发布时间】:2023-03-18 13:17:01
【问题描述】:

谁能告诉我如何在整个屏幕上放置一个半透明的黑色蒙版,但排除特定 UIView 的区域?我想在 UITextField 上使用这个掩码,当点击文本字段的外部部分时,它会调用 resignFirstResponder。

子视图树如下:

UIWindow
|-UIView
| |-UITextField
|
|-面具

谢谢,

【问题讨论】:

  • 您是否尝试过绘制一个使用您要遮盖的对象的框架创建的对象?
  • 对不起,我的话一定是混淆了。我希望遮罩覆盖整个屏幕,只排除特定视图的区域。
  • 嗯...我发誓有一种 Core Graphics 方法可以解决这类问题。我会调查的。我很少使用低级图形的东西,所以我必须挖掘......

标签: iphone uiview masking


【解决方案1】:

您可以使用:

- (void)bringSubviewToFront:(UIView *)view

并在添加黑色蒙版视图后将 UITextField 发送到前面。

更新

好的,这是执行此操作的步骤(您可以查看 UIGestureRecognizers 的苹果示例了解更多信息)

  1. 创建一个遮罩视图(以编程方式或使用 IB)并将其命名为“maskView”。
  2. 创建一个gestureRecognizer并将其添加到maskView。

            UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)];
            recognizer.delegate = self;
            UIImageView *maskView =  [[UIImageView alloc] init];
            [maskView addGestureRecognizer:recognizer];
    
  3. 您需要将视图控制器设置为“UIGestureRecognizerDelegate”的委托

    @interface YourViewController : UIViewController   <UIGestureRecognizerDelegate>
    
  4. 当你想屏蔽屏幕时,将 maskView 添加到你的 ViewController。然后将文本字段移到掩码上方。

    [self.view addSubView:maskView]; [self.view bringSubviewToFront:textField];

  5. 设置这两个功能: 在第一个中,您可以设置用户触摸面具时的操作

    - (void)handleTapFrom:(UITapGestureRecognizer *)recognizer {
    //resign the first responder when the user taps the mask
     //you can remove the mask here if you want to   
    

    } 在第二个中,您告诉应用不要接收来自 textField 的触摸

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    
    // Disallow recognition of tap gestures in the segmented control.
    if ((touch.view == textField)) {//checks if the touch is on the textField
        return NO;
    }
    return YES;
    

    }

希望有点意思

沙尼

【讨论】:

  • 感谢您的回答,但很抱歉,我的观点没有再次正确。我在帖子中添加了一个子视图树图。我希望掩码覆盖整个窗口,所以掩码必须是窗口的子视图,而不是文本字段的父视图。
  • 嘿。为什么遮盖窗口而不是视图对您来说很重要?
  • 因为我希望响应者在点击窗口的任何点时辞职。
  • 那你为什么不能在面具上添加一个手势识别器并排除文本字段呢?
  • 我在回答中添加了解释。希望它会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多