大头针的使用

首先,我们需要知道的是一个大头针必须确定的是他的经纬度坐标

(一)大头针的简单实使用,无需自定义(只能是大头针扎进地图)

1.因为系统自带的类MKAnnotation的属性是readonly,如果我们要设置这些属性值的话我们只能自己自定义一个属性然后继承MKAnnotation

@interface TLLAnnotation : NSObject<MKAnnotation>
@property (nonatomic,assign) CLLocationCoordinate2D coordinate;//坐标
@property (nonatomic, copy) NSString *title;//大头针标题
@property (nonatomic, copy) NSString *subtitle;//大头针子标题
@end

2.在viewController里面增加mapView属性,遵循 MKMapViewDelegate 协议,使得大头针扎进这个mapView里面

#import "ViewController.h"
#import "TLLAnnotation.h"

@interface ViewController ()<MKMapViewDelegate>
@property (nonatomic,strong) MKMapView *mapView;
@end

@implementation ViewController
- (MKMapView *)mapView {
    if (!_mapView) {
        _mapView = [[MKMapView alloc]initWithFrame:self.view.bounds];
        [self.view addSubview:_mapView];
    }
    return _mapView;
}


- (void)viewDidLoad {
    [super viewDidLoad];
    self.mapView.delegate = self;
    
    TLLAnnotation *anno1 = [[TLLAnnotation alloc]init];
    anno1.coordinate = CLLocationCoordinate2DMake(37, 116);
    anno1.title = @"不知道是哪";
    anno1.subtitle = @"hhhahahhhhahahha";
    [self.mapView addAnnotation:anno1];
    
    TLLAnnotation *anno2 = [[TLLAnnotation alloc]init];
    anno2.coordinate = CLLocationCoordinate2DMake(29, 110);
    anno2.title = @"还是不知道是哪";
    anno2.subtitle = @"gububuvvuuuuuuuuuu";
    [self.mapView addAnnotation:anno2];
}
@end
这样,基本的定位就实现了,效果如下



但是,如果我们需要自定义大头针的颜色,更改大头针下落的效果,或者是有上百上千个大头针,我们还需要考虑到循环引用大头针,而此时,MKMapViewDelegate的代理方法

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation 完全可以帮助我们达到效果

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation {
    NSString *reuseIdentifier = @"reuseIdentifier";
     // 1.先从缓存池中取出可以循环利用的大头针控件
    MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseIdentifier];
    
    // 2.缓存池中没有可以循环利用的大头针控件
    if (!annotationView) {
        
        // 传入循环利用标识来创建大头针控件
        annotationView = [[MKPinAnnotationView alloc]initWithAnnotation:nil reuseIdentifier:reuseIdentifier];
        
         // 设置头的颜色
        annotationView.pinTintColor = [UIColor purpleColor];
        
        // 显示标题和子标题
        annotationView.canShowCallout = YES;
        
        // 从天而降
        annotationView.animatesDrop = YES;
        
         // 显示标题和子标题
        annotationView.calloutOffset = CGPointMake(0, -10);
        annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeContactAdd];
        annotationView.leftCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeInfoDark];
        
         // 往大头针里面添加一个按钮
        //[annotationView addSubview:[UIButton buttonWithType:UIButtonTypeContactAdd]];
    }
    
    // 3.传递模型(更新大头针数据,覆盖掉之前的旧数据)
    annotationView.annotation = annotation;
    return annotationView;
}


自定义运行效果如下:


恩,此时虽然可以自定义了,但是我们还可以将要自定义的代码进行一个封装,顺便将大头针换成我们喜欢的图形吧,比如说各种团购的定位面对各种成百上千的大头针,进行一个分类那想必是再好不过的了(比如说是美食,旅游等)

1.新增MKAnnotationView类,并增加方法

TLAnnotationView.h文件
<span style="font-family: Menlo;">#import <MapKit/MapKit.h></span>

@interface TLAnnotationView : MKAnnotationView
+ (instancetype)annotationViewWithMapView:(MKMapView *)mapView;
@end

<pre name="code" class="objc" style="color: rgb(76, 191, 87); font-size: 14px;">TLAnnotationView.m文件(封装大头针)
<pre name="code" class="objc">#import "TLAnnotationView.h"
#import "TLLAnnotation.h"
@interface TLAnnotationView()
@property (nonatomic,weak) UIImageView *iconView;
@end

@implementation TLAnnotationView
//将大头针放进相应的mapView
+ (instancetype)annotationViewWithMapView:(MKMapView *)mapView {
    NSString *reuseIdentifier = @"reuseIdentifier";
    TLAnnotationView *annoView = (TLAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseIdentifier];
    if (!annoView) {
        // 传入循环利用标识来创建大头针控件
        annoView = [[TLAnnotationView alloc]initWithAnnotation:nil reuseIdentifier:reuseIdentifier];
    }
    return  annoView;
}


//进行一些初始化的设置
- (id)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier {
    if ([super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]) {
        //显示标题和子标题
        self.canShowCallout = YES;
        
        //左边显示一个图片
        UIImageView *image = [[UIImageView alloc]init];
        image.bounds = CGRectMake(0, 0, 30, 30);
        self.leftCalloutAccessoryView = image;
        self.iconView = image;
    }
    return self;
}


- (void)setAnnotation:(TLLAnnotation *)annotation {
    [super setAnnotation:annotation];
    self.image = [UIImage imageNamed:annotation.iconView];
    self.iconView.image = self.image;
}
@end


 

 
2.在TLLAnotation类中增加图片属性
<pre name="code" class="objc">#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface TLLAnnotation : NSObject<MKAnnotation>
@property (nonatomic,assign) CLLocationCoordinate2D coordinate;//坐标
@property (nonatomic, copy) NSString *title;//大头针标题
@property (nonatomic, copy) NSString *subtitle;//大头针子标题

//新增图片属性
@property (nonatomic,copy) NSString *iconView;
@end

3.代理方法即可简化如下
 
<pre name="code" class="objc">- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(TLLAnnotation *)annotation{
    
    // 返回nil就会按照系统的默认做法
    if (![annotation isKindOfClass:[TLLAnnotation class]]) return nil;
    
     // 1.获得大头针控件
    TLAnnotationView *annoView = [TLAnnotationView annotationViewWithMapView:mapView];
    
    // 2.传递模型
    annoView.annotation = annotation;
    return annoView;
}


 运行结果如下图所示,这样一来,自定义图片基本完成 




尽管已经到了如此的地步,但是我们此时还并未满意,你有没有发现有时候点击annotationView的时候我们需要的并不是他自带的view,他或许是一个tableView,或许是一个clooectionView,又或者其他,这时候在下面这个方法中写点击annotation弹出的各种View即可

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    
    UIButton *redView = [[UIButton alloc] init];
    [redView addTarget:self action:@selector(redClick) forControlEvents:UIControlEventTouchUpInside];
    redView.backgroundColor = [UIColor redColor];
    redView.width = 20;
    redView.height = 20;
    redView.y = - redView.height;
    redView.x = (self.width - redView.width) * 0.5;
    [self addSubview:redView];
    self.redView = redView;
    
    UIButton *greenView = [[UIButton alloc] init];
    [greenView addTarget:self action:@selector(greenClick) forControlEvents:UIControlEventTouchUpInside];
    greenView.backgroundColor = [UIColor greenColor];
    greenView.width = 20;
    greenView.height = 20;
    greenView.y = 20;
    greenView.x = 20;
    [self addSubview:greenView];
    self.greenView = greenView;
}

运行效果如下:


们需要自定义 的图形即可

在处理点击事件的时候,因为红色View已经到了annotationView的外面,所以点击它并没有进入到redClick,为了拦截住redClick,我们需要增加一个方法

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    if (CGRectContainsPoint(self.redView.frame, point)) {
        return self.redView;
    }
    return [super hitTest:point withEvent:event];
}

这样,redClick和greenClick就都会响应并且不会混乱了,至于这个方法的作用,将在下面的博客里面在做介绍。


MKAnnotation创建一个类继承    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: DeskPins是一个实用的Windows工具,允许用户在Windows任务栏中将任何窗口顶置在其他窗口之上。以下是使用DeskPins的简单步骤: 1.首先,下载并安装DeskPins。您可以在DeskPins的官方网站或其他可信的软件下载网站上找到它,并按照安装指南进行安装。 2.安装完成后,启动DeskPins。在系统托盘或任务栏中,您会看到一个小图标(可能是大头针的图标)表示DeskPins正在运行。 3.现在,打开您要顶置在其他窗口之上的窗口。您可以打开浏览器、文档、媒体播放器等等。 4.将鼠标移动到您要顶置的窗口的标题栏或其他可拖动的区域。然后,按住“Ctrl”和“鼠标左键”不松开,将鼠标拖动到任务栏或系统托盘上的DeskPins图标上。 5.松开鼠标按钮,该窗口将被“大头针”标记。这意味着该窗口将始终保持在其他窗口之上。 6.如果您想取消顶置某个窗口,只需将鼠标拖动到任务栏或系统托盘中的DeskPins图标上,然后松开鼠标按钮。 7.除了使用鼠标,您还可以使用快捷键来顶置和取消顶置窗口。默认情况下,使用“Ctrl”+ “F12”可以进行快速顶置和取消顶置。 总的来说,DeskPins是一个简单而实用的工具,可以帮助您更好地组织您的桌面和任务,提高使用体验。希望这些简单的说明可以帮助您了解如何使用DeskPins。 ### 回答2: DeskPins是一款免费的窗口置顶工具,它可以帮助用户保持特定窗口始终置顶在其他应用程序之上。下面是使用DeskPins的方法。 首先,你需要下载和安装DeskPins软件,然后启动它。 当DeskPins运行时,你会注意到在系统托盘区域出现了一个小图标。单击这个图标,它会显示所有当前打开的窗口的列表。 接下来,选择你想要置顶的窗口。鼠标指针会变成一个图钉图标。 将鼠标指针移动到你想要置顶的窗口上,然后单击左键。该窗口现在会保持在顶部,无论你是否点击其他应用程序,它都会一直停留在那里。 如果你想要取消窗口的置顶状态,只需将鼠标指针移动到该窗口上,然后再次单击左键。窗口将恢复到正常的层次结构,并可以被其他窗口遮挡。 DeskPins还提供了一些其他选项和功能,如禁用窗口置顶选项和自启动选项。你可以通过右键单击系统托盘图标来访问这些选项。 总的来说,DeskPins是一个简单易用但功能强大的工具,可以帮助用户在需要时快速将窗口置顶,使其保持在屏幕顶部。 ### 回答3: DeskPins 是一种方便的桌面工具,可以让用户将任何应用程序窗口固定在屏幕上而不会被关闭或移动。以下是使用 DeskPins 的方法: 1. 下载和安装:首先,您需要从官方网站或其他可信来源下载 DeskPins 并按照安装程序的说明进行安装。 2. 启动和使用:在安装完成后,您可以在任务栏中找到 DeskPins 的图标。通过点击该图标,您可以启动 DeskPins。 3. 固定窗口:在启动 DeskPins 后,您可以看到鼠标指针变为一个大头针的形状。将其悬停在您想要固定的应用程序窗口上,并单击左键。这样,窗口就会被固定在桌面上,并且不会在其他操作或关闭窗口时移动。 4. 解除窗口固定:如果您想解除窗口的固定,只需将鼠标指针悬停在窗口上,并再次单击左键。窗口将不再固定在屏幕上,可以像平常一样进行操作。 5. 设置窗口规则:DeskPins 还允许用户设置窗口规则,来自动固定或解除固定窗口。通过右键单击 DeskPins 图标,并选择“Options”选项,您可以打开设置窗口。在这里,您可以定义特定应用程序的行为,例如窗口打开时是否自动固定、禁用固定等等。 总而言之,DeskPins 是一个简单而实用的工具,它允许用户轻松地将任何应用程序窗口固定在屏幕上,提高工作效率并优化桌面布局。不同于其他许多应用程序管理工具,DeskPins 不会改变窗口的大小或风格,只是简单地将它们固定在屏幕上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值