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 处于活动状态的主要内容,如果未能解决你的问题,请参考以下文章