- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
如何检测点击注释标注的标题?我已经有一个右标注配件和一个左标注配件,但我想检测用户是否点击了标题(位于标注的中心)。
如果这不可能,如何在点击标题时禁用隐藏标注?
最佳答案
现在回答你的问题有点晚了,但我最近正在处理同样的问题,我自己通过反复试验来解决我的问题。也许我可以帮助处理同样问题的人。
您还可以使用一些自定义注释和标注 View 类,那里有很多示例。但是,还有另一种无需使用复杂的外部类即可解决此问题的简单方法。
问题定义:我希望能够通过在标注 View 中触摸来触发某些方法。我不想使用右或左辅助按钮。但是当我触摸标注 View 时, View 会立即消失。
解决方案的简短说明:只需我们使用带有“hittest”的自定义“MKPinAnnotationView”来检测标注 View 中的触摸。
您还可以在文章末尾找到 github 项目链接。
touchableCallOutsViewController.h
//
// touchableCallOutsViewController.h
// touchableCallOuts
//
// Created by yasin turkoglu on 20.11.2012.
// Copyright (c) 2012 yasin turkoglu. All rights reserved.
//
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
@class myCustomPinAnnotationClass;
@interface touchableCallOutsViewController : UIViewController <MKMapViewDelegate> {
MKMapView *myMapView;
int pinCounter;
myCustomPinAnnotationClass *myAnnotation;
CLLocationCoordinate2D selectedPinCoordinate;
int selectedPinNumber;
}
@property (strong, nonatomic) MKMapView *myMapView;
@property (strong, nonatomic) myCustomPinAnnotationClass *myAnnotation;
@end
touchableCallOutsViewController.m
//
// touchableCallOutsViewController.m
// touchableCallOuts
//
// Created by yasin turkoglu on 20.11.2012.
// Copyright (c) 2012 yasin turkoglu. All rights reserved.
//
#import "touchableCallOutsViewController.h"
#import "myCustomPinAnnotationClass.h"
@interface touchableCallOutsViewController ()
@end
@implementation touchableCallOutsViewController
@synthesize myMapView;
@synthesize myAnnotation;
- (void)viewDidLoad
{
//first we create mapview and add pin annotation
myMapView = [[MKMapView alloc]initWithFrame:self.view.frame];
myMapView.delegate = self;
MKCoordinateRegion region = {{0,0},{1.0,1.0}};
region.center.latitude = 41.036651; //user defined
region.center.longitude = 28.983870;//user defined
[myMapView setRegion:region animated:YES];
[self.view addSubview:myMapView];
//we define long press recognizer for 2 seconds and add our map view to add new pin when you press 2 seconds on map view
UILongPressGestureRecognizer *lngPrs = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(handleMyLongPress:)];
lngPrs.minimumPressDuration = 2.0;
[myMapView addGestureRecognizer:lngPrs];
pinCounter = 1; //this variable hold pin numbers and increment 1 when new pin added.
myAnnotation = [[myCustomPinAnnotationClass alloc]initWithName:[NSString stringWithFormat:@"Pin %i",pinCounter] description:@"touch here to see pin coordinates" pinNum:pinCounter coordinate:region.center];
[myMapView addAnnotation:myAnnotation];
}
- (void)handleMyLongPress:(UIGestureRecognizer *)gestureRecognizer
{
if (gestureRecognizer.state != UIGestureRecognizerStateBegan) {
}else{
//when we press more than 2 seconds on map view UILongPressGestureRecognizer triggered this method and call our custom MKPinAnnotationView class and add annotation.
CGPoint touchPoint = [gestureRecognizer locationInView:myMapView];
CLLocationCoordinate2D touchMapCoordinate = [myMapView convertPoint:touchPoint toCoordinateFromView:myMapView];
pinCounter++;
myAnnotation = [[myCustomPinAnnotationClass alloc]initWithName:[NSString stringWithFormat:@"Pin %i",pinCounter] description:@"touch here to see pin coordinates" pinNum:pinCounter coordinate:touchMapCoordinate];
[myMapView addAnnotation:myAnnotation];
}
}
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
//when new annotation added by us, new annotation property will set here
static NSString *identifier = @"myPins";
if ([annotation isKindOfClass:[myCustomPinAnnotationClass class]]) {
myCustomPinAnnotationClass *annotationView = (myCustomPinAnnotationClass *) [self.myMapView dequeueReusableAnnotationViewWithIdentifier:identifier];
if (annotationView == nil) {
annotationView = [[myCustomPinAnnotationClass alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
} else {
annotationView.annotation = annotation;
}
myAnnotation = (myCustomPinAnnotationClass *)annotation;
annotationView.pinColor = MKPinAnnotationColorGreen;
annotationView.enabled = YES;
annotationView.draggable = YES;
annotationView.canShowCallout = YES;
[annotationView setSelected:YES animated:YES];
return annotationView;
}
return nil;
}
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
//if you select any annotation to show their callout sellected annotation pin number and coordinate setted and call findcallot method
myAnnotation = (myCustomPinAnnotationClass *)view.annotation;
selectedPinCoordinate = myAnnotation.coordinate;
selectedPinNumber = myAnnotation.pinNum;
[self findCallOut:myMapView];
}
- (void)findCallOut:(UIView *)node
{
//this method dig our mapview with for loop until find callout view class named "UICalloutView"
if([node isKindOfClass:[NSClassFromString(@"UICalloutView") class]]){
//this method trigered together with callout open animation.
//in UICalloutView we have callout bubble image
//we dig it with for loop to find this image height
float buubleHeight = 0.0;
for(UIImageView *bubbleComponents in node.subviews){
//when we find callout bubble image take height to set our touchable area height
buubleHeight = bubbleComponents.frame.size.height;
break;
}
//this method triger with callout open animation as I said before
//ant this bouncing open animation distort actual size of callout view
//so when this happens we also get transform value of callout view and make proportion to find exact sizes.
CGFloat nodeTransformRatio = node.transform.a;
CGFloat calculatedWidth = roundf(node.frame.size.width / nodeTransformRatio);
CGFloat calculatedHeight = roundf(buubleHeight / nodeTransformRatio);
//now create a new UIView and sized according to callout view.
UIView *touchableView = [[UIView alloc]initWithFrame:CGRectMake(0.0, 0.0, calculatedWidth, calculatedHeight)];
touchableView.userInteractionEnabled = YES;
//we add new single tap gesture recognizer to triger desired method when users touching to the callout
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doSomething)];
[touchableView addGestureRecognizer:singleTap];
//and finaly we add this newly created view in callout view to receive touches.
[node addSubview:touchableView];
}else{
//loop self until find a "UICalloutView"
for(UIView *child in node.subviews){
[self findCallOut:child];
}
}
}
- (void)doSomething
{
//this method call allert view our preseted variables when users touch callout view.
UIAlertView *alertHolder = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"You're touched the Pin %i CallOut",selectedPinNumber] message:[NSString stringWithFormat:@"lat : %f\nlong : %f",selectedPinCoordinate.latitude,selectedPinCoordinate.longitude] delegate:self cancelButtonTitle:nil otherButtonTitles:@"ok",nil];
[alertHolder show];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
myCustomPinAnnotationClass.h
//
// myCustomPinAnnotationClass.h
// touchableCallOuts
//
// Created by yasin turkoglu on 20.11.2012.
// Copyright (c) 2012 yasin turkoglu. All rights reserved.
//
#import <MapKit/MapKit.h>
@interface myCustomPinAnnotationClass : MKPinAnnotationView <MKAnnotation> {
NSString *_name;
NSString *_description;
int _pinNum;
CLLocationCoordinate2D _coordinate;
}
@property (copy) NSString *name;
@property (copy) NSString *description;
@property (nonatomic, readonly) int pinNum;
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
- (id)initWithName:(NSString*)header description:(NSString*)description pinNum:(int)pinNum coordinate:(CLLocationCoordinate2D)coordinate;
@end
myCustomPinAnnotationClass.m
//
// myCustomPinAnnotationClass.m
// touchableCallOuts
//
// Created by yasin turkoglu on 20.11.2012.
// Copyright (c) 2012 yasin turkoglu. All rights reserved.
//
#import "myCustomPinAnnotationClass.h"
@implementation myCustomPinAnnotationClass
@synthesize name = _name;
@synthesize description = _description;
@synthesize pinNum = _pinNum;
@synthesize coordinate = _coordinate;
- (id)initWithName:(NSString*)header description:(NSString*)description pinNum:(int)pinNum coordinate:(CLLocationCoordinate2D)coordinate
{
self = [super init];
if (self) {
_name = [header copy];
_description = [description copy];
_pinNum = pinNum;
_coordinate = coordinate;
}
return self;
}
- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate
{
_coordinate = newCoordinate;
}
- (NSString *)title {
return _name;
}
- (NSString *)subtitle {
return _description;
}
- (int)tag {
return _pinNum;
}
-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
//test touched point in map view
//when hit test return nil callout close immediately by default
UIView* hitView = [super hitTest:point withEvent:event];
// if hittest return nil test touch point
if (hitView == nil){
//dig view to find custom touchable view lately added by us
for(UIView *firstView in self.subviews){
if([firstView isKindOfClass:[NSClassFromString(@"UICalloutView") class]]){
for(UIView *touchableView in firstView.subviews){
if([touchableView isKindOfClass:[UIView class]]){ //this is our touchable view class
//define touchable area
CGRect touchableArea = CGRectMake(firstView.frame.origin.x, firstView.frame.origin.y, touchableView.frame.size.width, touchableView.frame.size.height);
//test touch point if in touchable area
if (CGRectContainsPoint(touchableArea, point)){
//if touch point is in touchable area return touchable view as a touched view
hitView = touchableView;
}
}
}
}
}
}
return hitView;
}
@end
在这里您可以下载带有源代码的完整项目 list https://github.com/ytur/touchableCallOutsForIOSMaps
关于ios - 检测点击标注的标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8469539/
当点击content 时,我想触发我的alert。我的 content 中可以有任意数量的子元素,所以我不想对每个元素都进行硬编码。我想也许我可以监听对该父元素的点击,然后每次点击子元素都会触发我的操
对于 Mac 应用程序,我想检测应用程序中的用户事件,因此我可以定期让 Web 服务知道用户在端点上仍然处于事件状态。 在 Cocoa Touch 中,我会覆盖 UIApplication 的 sen
第一次在这里发帖,但天知道我一直使用这个网站来搜索问题 :P 好吧,我现在遇到了自己的问题,我似乎无法轻松地在 Google 上搜索,在玩了大约 2 小时后,我终于决定发布一个问题,看看你们是怎么想的
Angular 触控 ngTouch导致在触摸释放时发生点击。 有没有办法让点击发生在触摸开始? fast-click下面的指令似乎可以在触摸屏上执行我想要的操作,但它不适用于鼠标点击。 myApp.
1) 如果我有这个,当我点击子 Container 时它不会打印'tap': Container( color: Colors.red, child: GestureDetector(
我简直要发疯了,只是想从 jQuery 中的事件中解除 onclick 处理程序的绑定(bind),以便稍后可以将其绑定(bind)到另一个函数。 我已将代码隔离在测试页中,因此除了核心之外什么都没有
我有一个有趣的情况。我需要触发实时点击,因为简单的点击不起作用。 这就是我所拥有的: $('.text').trigger('click'); 但我需要这样的东西: $('.text').trigge
这是我的作业,这是我第一次做表单验证。以下代码分别是我的HTML代码和JavaScript代码。 HTML 代码: First N
正如标题所示,如何获取 Magento 中特定产品的浏览量/点击量/展示次数。欢迎任何帮助。 最佳答案 这个简单的示例将为您提供在您指定的日期+其查看次数之间查看过的产品列表: $fromDate =
我正在创建一个应用程序,但在其中遇到错误。我想在按钮上添加 OnclickListner。该按钮位于 fragment 类上。从这个 fragment 类我想继续另一个类。代码如下: fragment
我在数组中有一些值。首先,我想在 View 中显示该数组的前两个值,接下来我想在某些按钮单击操作后显示剩余的值,并将数组索引增加 1。例如:一次点击显示第三个值,然后另一次点击显示第四个值。 我怎样才
在下面的代码片段中,如果在链接上执行“CMD+CLICK”,则不会显示 alert('CMD')。这是为什么? 我想在用户按下 CMD 按钮(或 Windows 上的 CTRL 键)+单击 href
我希望在单击链接时开始加载一些内容。在单击该链接之前,我不希望它使用任何带宽。另外如何实现几乎所有灯箱中都能看到的旋转光标动画? 最佳答案 使用$.ajax()函数动态加载内容。 对于动画,请找到一个
我有如下的 DOM: users 当用户点击按钮时,它会将新的“td”附加到“tr”。它运作良好。问题:单击“a”我想打开两个链接。最好的方法是首先将当前页面重定向到另一个页面,然后
这是我正在尝试做的.. 点击按钮会显示一个随机数组项。 数组项只能显示一次。 目前我已经将代码设置为: 点击随机数组项显示。 按钮点击继续循环,没有结束。 按钮点击多次显示元素。 这是代码的链接 ht
我想创建...基本上是一个宏程序。点击记录后,它会记录所有鼠标(可能最终是键盘)事件。然后你可以保存,然后播放,鼠标应该移动并点击在相同的地方当你录制它时它会发生。 我知道如何获取全局鼠标事件,但我不
我有一个关于将 onClick 添加到 ListView 的问题,我已经尝试尽可能多地遵循 Android NotePad 教程,但是对于我的布局我不太明白如何添加它。 这是 Activity 类,它
我正在使用一个网站以表格的形式显示信息。用户可以单击表格中的行来更改它们的颜色,我还有一个按钮允许用户暂停页面的刷新,这样就不会添加新信息。这两个功能都适用于桌面,但不适用于触摸屏。我的第一个想法是触
所以我的网站上有一个正常的链接,我想为它添加跟踪。我可以设想很多方法来做到这一点,但我已经确定通过编写一个小的 jquery 函数并在我的标签中放置一个小片段来实现这一点非常简单: click me!
我正在尝试使我的图片按钮看起来不错。我尝试了几种不同的方法,但它们看起来都不对。这是一个圆形图像,我想让它看起来像是可以按下的。这是我到目前为止所得到的。 android:textAppearance
我是一名优秀的程序员,十分优秀!