iOS:UIView 层次结构:在 UIView 下使 Map View 处于活动状态

Posted

技术标签:

【中文标题】iOS:UIView 层次结构:在 UIView 下使 Map View 处于活动状态【英文标题】:iOS: UIView hierarchy: make Map View active under UIView 【发布时间】:2014-02-05 12:18:47 【问题描述】:

我有简单的 UIView 层次结构:

container View:
→ Map View
→ Custom View

我的自定义视图与地图视图部分重叠。我可以看到地图,但我无法与地图交互,例如缩放、滚动等。

如何同时存档部分地图重叠和交互? 如果您有什么不明白的地方,请随时问我。

编辑

我想禁用黑色区域进行交互,但允许在圆圈中进行交互,即在我的 UIView 中心与黑色覆盖区域。

【问题讨论】:

mapview和customview相对于continer view的框架是什么? 为您的自定义视图应用掩码 @Apurv 与容器视图边界相同 @Daij-Djan 我怎样才能做到这一点?你能举个例子或链接吗? 顺便说一句,我做同样的事情。我掩盖了我的自定义视图以使地图进行交互。我添加了一个简化的示例 【参考方案1】:

我假设你有这样的东西:

你希望能够触摸红色区域,触摸黄色区域所在的地图,却被黄色子视图挡住了?

如果是这样,子类化黄色子视图并覆盖 -pointInside: 方法,该方法允许您指定触摸点是否会与视图碰撞,或者退回到它后面的视图。

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

    return [[UIBezierPath bezierPathWithOvalInRect:self.bounds] containsPoint:point];

【讨论】:

我只想和红色区域互动。我会尝试实现这一点。 哇,这个作品很有魅力,但我不明白我们为什么要做这样的矩形,为什么是这个数字?以及它们为什么起作用:) @flinth 我的数字只是一个例子,它只允许在 100x30 的正方形中进行交互。您应该更改代码以最适合您的触摸区域。 对于简单的表格,这很好。但是一旦表单变得更复杂,屏蔽会更好 IMO 简单形式包括可以轻松表示为贝塞尔路径的所有内容【参考方案2】:

如果视图仅部分覆盖其下方的视图,则应用掩码告诉 ios

例如来自我的 XBPageCurl 的 github 分支

- (void)applyCornerMaskAsNeeded 
    //
    //create mask
    //

    UIImage *cornerImage = [UIImage imageNamed:@"corner_view_mask.png"]; //this is black//white/alpha
    CGRect b = self.layer.bounds;
    CGRect rtCornerRect=CGRectZero;
    UIGraphicsBeginImageContextWithOptions(b.size, NO, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();

    //white bg
    CGContextSetFillColorWithColor(context, [[UIColor whiteColor] CGColor]);
    CGContextFillRect(context, b);

    //draw corner image mask
    CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, cornerImage.size.height);
    CGContextConcatCTM(context, flipVertical);
    CGContextSetBlendMode(context, kCGBlendModeCopy);
    rtCornerRect = [self cornerRectFor:XBPageDragViewCornerTopRight withSize:cornerImage.size.width];
    CGContextDrawImage(context, rtCornerRect, cornerImage.CGImage);
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    //   
    //apply mask
    //
    CALayer *l = [CALayer layer];
    l.frame = b;
    l.contents = (id)image.CGImage;
    l.name = @"XBPageDragViewCornersMask";
    [self.layer setMask:l];
    self.layer.masksToBounds = YES;


另一个例子是在苹果文档中,但这应该已经很清楚了:

    你画了面具。黑色,阿尔法 将蒙版应用到视图层 完成

【讨论】:

对我来说,仅仅阻止用户在某些区域进行交互的掩码似乎有点矫枉过正 @SomeGuy 好吧,如果它是一个简单的“矩形”(或其他简单形式),那么 pointInside 可能会更好,但如果你有更多......复杂的部分覆盖我说掩码更好 他们基本上不用担心:D 对于圆角交互遮罩,请查看 UIBezierPath,它还包含一个 -pointInside: 方法,可以与 UIView -pointInside 一起使用: @SomeGuy 我更新了我的问题,感谢您的帮助

以上是关于iOS:UIView 层次结构:在 UIView 下使 Map View 处于活动状态的主要内容,如果未能解决你的问题,请参考以下文章

UIActivityIndi​​cator 在构建 UIView 层次结构时旋转?

[iOS]视图与UIVIew

iOS:UIView 动画,没有动画发生

获取 uiview 层次结构顶部的对象

在 iOS 中调整 UIView 的大小

如何将视图带到 UIView 层次结构的顶部