2017-02-22 61 views
0

TL的用户交互; DR如何禁用一个UIView的面具

我只是想知道是否有任何方法来禁用只为视图的遮蔽部分用户交互。

我这里还有场景:

  1. 我有两个观点视图B,都是平等宽度等高的。

  2. 视图B是上视图A的顶部

  3. 我在底部施加在视图B掩模(CAShapeLayer)看的视图的内容(两个按钮)甲

由于视图B有一个面具,我只能看到的内容,但我ñ不能与它交互。

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

+1

我不知道,但我在这里想我的答案:http://stackoverflow.com/a/37658235/6285303相关 – sanman

回答

0

让你查看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; 
 
}