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

我有简单的 UIView 层次结构:

container View:
→ Map View
→ Custom View

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

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

编辑

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

【问题讨论】:

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

标签: ios objective-c uiview mkmapview core-graphics


【解决方案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;

}

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

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

【讨论】:

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