iOS hitTest withEvent

杰西·希亚特(Jesse Hiatt)

我正在尝试使用hitTest withEvent获取对在蒙版UIImageView下面的UImageView的引用。这是我不工作的东西:

UIView A包含3个UIImageViews作为子视图:panelOne,panelTwo和panelThree。panelThree占据了整个框架,但被遮盖成一个三角形,露出了面板1和面板2的一部分。因此,我需要检测用户何时在该矩形之外点击,并将触摸发送到适当的UIImageView。

代码:(CollagePanel是UIImageView的子类)

-(void)triangleInASquare
{
    CGSize size = self.frame.size;
    CollagePanel *panelOne = [[CollagePanel alloc] initWithFrame:CGRectMake(0,0, size.width/2, size.height)];
    panelOne.panelScale = panelOne.frame.size.width/self.frame.size.width;
    panelOne.backgroundColor = [UIColor greenColor];

    CollagePanel *panelTwo = [[CollagePanel alloc] initWithFrame:CGRectMake(size.width/2,0, size.width/2, size.height)];
    panelTwo.panelScale = panelOne.frame.size.width/self.frame.size.width;
    panelTwo.backgroundColor = [UIColor purpleColor];

    CollagePanel *panelThree = [[CollagePanel alloc] initWithFrame:CGRectMake(0,0, size.width, size.height)];
    panelThree.backgroundColor = [UIColor orangeColor];

    UIBezierPath* trianglePath = [UIBezierPath bezierPath];
    [trianglePath moveToPoint:CGPointMake(0, panelThree.frame.size.height)];
    [trianglePath addLineToPoint:CGPointMake(panelThree.frame.size.width/2,0)];
    [trianglePath addLineToPoint:CGPointMake(panelThree.frame.size.width, panelTwo.frame.size.height)];
    [trianglePath closePath];

    // Mask the panels's layer to triangle.
    CAShapeLayer *triangleMaskLayer = [CAShapeLayer layer];
    [triangleMaskLayer setPath:trianglePath.CGPath];
    triangleMaskLayer.strokeColor = [[UIColor whiteColor] CGColor];
    panelThree.layer.mask = triangleMaskLayer;

    //Add border
    CAShapeLayer *borderLayer = [CAShapeLayer layer];
    borderLayer.strokeColor = [[UIColor whiteColor] CGColor];
    borderLayer.fillColor = [[UIColor clearColor] CGColor];
    borderLayer.lineWidth = 6;
    [borderLayer setPath:trianglePath.CGPath];

    [panelThree.layer addSublayer:borderLayer];

    NSMutableArray *tempArray = [[NSMutableArray alloc] init];
    [tempArray addObject:panelOne];
    [tempArray addObject:panelTwo];
    [tempArray addObject:panelThree];

    [self addGestureRecognizersToPanelsInArray:tempArray];
    [self addPanelsFromArray:tempArray];
    self.panelArray = tempArray;
}

-(void)handleTap: (UITapGestureRecognizer*) recognizer //coming from panel.imageView
{
    CGPoint tapPoint = [recognizer locationInView:self];
    NSLog(@"Location in self: %@", NSStringFromCGPoint(tapPoint));
    NSLog(@"self.subviews: %@", self.subviews);
    UIView *bottomView = [self hitTest:tapPoint withEvent:nil];
    NSLog(@"Bottom View: %@", bottomView);
}

bottomView的NSLog始终是panelThree(最上面的面板)。据我了解,命中测试应该返回“最底端”子视图。

北欧海盗

你明白错了。它会返回将自己识别为被触摸并且最接近您的手指,更接近顶部的视图。
如果某个视图在某点上不能将自身识别为触摸,则需要覆盖

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

对于那个观点。

我认为Ole Begemann的“ Shapped Button”是一个很好的示例。

在您的项目中,此方法可以确定路径中是​​否存在点:CGPathContainsPoint


pointInside:withEvent:可能看起来像这样:

#import "CollagePanel.h"
#import <QuartzCore/QuartzCore.h>

@implementation CollagePanel
//
// ...
//
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    CGPoint p = [self convertPoint:point toView:[self superview]];
    if(self.layer.mask){
        if (CGPathContainsPoint([(CAShapeLayer *)self.layer.mask path], NULL, p, YES) )
            return YES;
    }else {
        if(CGRectContainsPoint(self.layer.frame, p))
            return YES;
    }
    return NO;
}

@end

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

hitTest:WithEvent和Subviews

来自分类Dev

Swift hitTest:point withEvent检测子视图

来自分类Dev

使用hitTest:withEvent:返回自定义对象

来自分类Dev

iOS-UIScrollView hitTest不包含触摸

来自分类Dev

iOS动画演示层hitTest似乎无法正常工作

来自分类Dev

pointInside:withEvent:在iOS8的键盘上键入时调用

来自分类Dev

Actionscript hitTest绘图

来自分类Dev

HitTest()的替代方法

来自分类Dev

SceneKit – DAE模型的HitTest

来自分类Dev

ARKit - 扩展“hitTest”的范围

来自分类Dev

UICollectionView hitTest->正常行为

来自分类Dev

CTreeCtrl HitTest返回NULL MFC

来自分类Dev

EaselJS hitTest在移动位图上

来自分类Dev

HTML5 canvas hittest任意形状

来自分类Dev

WPF VisualTreeHelper.HitTest使用多个线程

来自分类Dev

hitTest消除引起奇怪行为的键盘

来自分类Dev

CALayer :: hitTest在横向方向上失败

来自分类Dev

迷宫状对象内的HitTest错误movieclip

来自分类Dev

hitTest 在 SceneKit / ARKit 中不起作用

来自分类Dev

用VBA和ActiveX减少WithEvent声明和子

来自分类Dev

检查-touchesEnded:touches withEvent:event是否在某个矩形内

来自分类Dev

point 和 hitTest 之间有什么区别以及我如何使用 hitTest?

来自分类Dev

在CALayer上使用hitTest-如何找到被击中的图层(Swift)?

来自分类Dev

Swift:另一个UIView下的UIView的hitTest

来自分类Dev

ARKit –使用raycastQuery而不是hitTest轻击节点,已过时

来自分类Dev

ARKit –使用raycastQuery而不是hitTest轻击节点,已过时

来自分类Dev

从类中在舞台上使用带有movieClips的HitTest

来自分类Dev

hitTest检查影片剪辑,而不检查其父级

来自分类Dev

hitTest or hitTestObject to detect a collision with multiple objects in AS3?

Related 相关文章

热门标签

归档