【问题标题】:How to disable user interaction of a UIView's mask如何禁用 UIView 掩码的用户交互
【发布时间】:2017-07-12 04:26:29
【问题描述】:

TL;DR

我只是想知道是否有任何方法可以仅对视图的蒙版部分禁用用户交互。

这是场景:

  1. 我有两个视图View AView B,它们都是等宽等高强>.

  2. 视图 B 位于视图 A 之上。

  3. 我在底部的View B上应用了一个蒙版(CAShapeLayer)来查看View A的内容(两个按钮) >

由于 View B 有遮罩,我只能看到 View A 的内容,但无法与之交互。

任何帮助将不胜感激。谢谢。

【问题讨论】:

标签: ios swift uiview mask setuserinteractionenabled


【解决方案1】:

让您将 B 视为清晰的颜色,并在您的项目 UIView+ColorOfPoint 中尝试 UIView+ColorOfPoint.hUIView+ColorOfPoint.m 文件,并在您的视图控制器或视图的子类中使用下面的代码.. Sample Project 我正在使用下面的代码UIView 子类(自定义类)。

#pragma mark - Hit testing

- (BOOL)isAlphaVisibleAtPoint:(CGPoint)point forImage:(UIView *)view
{
    // Correct point to take into account that the image does not have to be the same size
    // as the button. See https://github.com/ole/OBShapedButton/issues/1
    CGSize iSize = view.bounds.size;
    CGSize bSize = self.bounds.size;
    point.x *= (bSize.width != 0) ? (iSize.width / bSize.width) : 1;
    point.y *= (bSize.height != 0) ? (iSize.height / bSize.height) : 1;
    
    UIColor *pixelColor = [view colorOfPoint:point];
    CGFloat alpha = 0.0;
    
    if ([pixelColor respondsToSelector:@selector(getRed:green:blue:alpha:)])
    {
        // available from iOS 5.0
        [pixelColor getRed:NULL green:NULL blue:NULL alpha:&alpha];
    }
    else
    {
        // for iOS < 5.0
        // In iOS 6.1 this code is not working in release mode, it works only in debug
        // CGColorGetAlpha always return 0.
        CGColorRef cgPixelColor = [pixelColor CGColor];
        alpha = CGColorGetAlpha(cgPixelColor);
    }
    return alpha >= kAlphaVisibleThreshold;
}



// UIView uses this method in hitTest:withEvent: to determine which subview should receive a touch event.
// If pointInside:withEvent: returns YES, then the subview’s hierarchy is traversed; otherwise, its branch
// of the view hierarchy is ignored.
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    // Return NO if even super returns NO (i.e., if point lies outside our bounds)
    BOOL superResult = [super pointInside:point withEvent:event];
    if (!superResult) {
        return superResult;
    }
    
    // Don't check again if we just queried the same point
    // (because pointInside:withEvent: gets often called multiple times)
    if (CGPointEqualToPoint(point, self.previousTouchPoint)) {
        return self.previousTouchHitTestResponse;
    } else {
        self.previousTouchPoint = point;
    }
    
    BOOL response = NO;
    
    if (self == nil) {
        response = YES;
    }
    else if (self!= nil) {
        response = [self isAlphaVisibleAtPoint:point forImage:self];
    }
    else {
        if ([self isAlphaVisibleAtPoint:point forImage:self]) {
            response = YES;
        } else {
            response = [self isAlphaVisibleAtPoint:point forImage:self];
        }
    }
    
    self.previousTouchHitTestResponse = response;
    return response;
}





- (void)resetHitTestCache
{
    self.previousTouchPoint = CGPointMake(CGFLOAT_MIN, CGFLOAT_MIN);
    self.previousTouchHitTestResponse = NO;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多