0

TL;博士

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

这是场景:

  1. 我有两个视图View AView B,它们都是Equal WidthEqual Height

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

  3. 我在底部的视图 B上应用了蒙版(CAShapeLayer)以查看视图A的内容(两个按钮)

由于View B有一个面具,我只能看到View A的内容,但我无法与之交互。

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

4

1 回答 1

0

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

#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;
}

于 2017-02-22T09:42:16.967 回答