Pho*_* Le 9 iphone cocoa-touch objective-c ios
我目前有一个地图视图,上面有一些注释.我有自定义图像的注释.我试图解决的问题是图像的敏感性.当我试图拖动它们时,感觉我必须触摸确切的中心才能集中注意力.有没有办法让触摸界更大?
jha*_*ott 18
为此,您需要子类MKAnnotationView来创建自己的自定义MKAnnotationView.在您的子类中,重写以下函数:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
{
// Return YES if the point is inside an area you want to be touchable
}
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
// Return the deepest view that the point is inside of.
}
Run Code Online (Sandbox Code Playgroud)
这允许按下交互式视图(例如按钮等).默认实现MKAnnotationView不严格pointInside,hitTest因为它允许实际位于一个注释内的按钮被发送到不同的注释.它通过将最接近的注释中心计算到触摸点并将事件发送到该注释来实现这一点,这使得紧密(重叠)注释不会阻止彼此被选中.但是,在您的情况下,如果用户要选择并拖动最顶层的注释,您可能想要阻止其他注释,因此上述方法可能就是您想要的,否则它会将您设置在正确的路径上.
编辑:
我在评论中被问到一个示例实现hitTest:withEvent:- 这取决于你想要实现的目标.原始问题建议在注释中触摸和拖动图像,而在我的情况下,我在注释中有一些按钮,我想要是交互式的.这是我的代码:
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
UIView* hitView = [super hitTest:point withEvent:event];
if (hitView != nil)
{
// ensure that the callout appears above all other views
[self.superview bringSubviewToFront:self];
// we tapped inside the callout
if (CGRectContainsPoint(self.resultView.callButton.frame, point))
{
hitView = self.resultView.callButton;
}
else if (CGRectContainsPoint(self.resultView.addButton.frame, point))
{
hitView = self.resultView.addButton;
}
else
{
hitView = self.resultView.viewDetailsButton;
}
[self preventSelectionChange];
}
return hitView;
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的那样非常简单 - MKAnnotationView实现(super在我的实现的第一行上调用)仅返回第一个(最外层)视图,它不会向下钻取视图层次结构以查看触摸实际位于哪个子视图中.在我的情况下,我只是检查触摸是否在三个按钮之一并返回.在其他情况下,您可以在层次结构中进行简单的基于矩形的钻取或更复杂的命中测试,例如,以避免视图中的透明区域允许触摸通过这些部分.如果您确实需要向下钻取,CGRectContainsPoint可以按照我使用它的方式使用,但请记住将您的点偏移到您钻取的每个视图级别的本地视图坐标.
preventSelectionChange我的方法是防止我的自定义注释被选中,我将它用作地图引脚的可自定义/交互式标注,这样可以保持与选择相关的引脚,而不是允许选择更改为此注释.
| 归档时间: |
|
| 查看次数: |
6394 次 |
| 最近记录: |