gpt4 book ai didi

ios - 设置自定义 MKPinAnnotationView 图像

转载 作者:行者123 更新时间:2023-11-29 12:44:00 28 4
gpt4 key购买 nike

我正在尝试根据某些条件为 MKPinAnnotationView 创建三个自定义图钉图像注释。在这种情况下,我将遍历自行车站对象的 for 循环,检查可用自行车的数量是否为 0,如果是,则设置一个 pin.image,如果不是,则设置另一个 pin.image。我也在检查码头数量是否为 0 并相应地设置另一个图像。我知道,在某些情况下,第一个 if 语句的计算结果为 YES,但是所有的引脚注释都与语句的 else 部分中表示的图像一起出现。我想我对在哪里实例化 MKAnnotationView 并返回它感到困惑,这样我的所有图钉图像就不会像现在一样返回相同的图像。

       - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
for (DivvyStation *divvyStation in self.divvyStations) {
if (divvyStation.availableBikes.intValue < 1) {
MKPinAnnotationView *pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
pin.canShowCallout = YES;
pin.image = [UIImage imageNamed:@"nobikes"];
return pin; }
else if (divvyStation.availableDocks.intValue < 1) {
MKPinAnnotationView *pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
pin.canShowCallout = YES;
pin.image = [UIImage imageNamed:@"dock"];
return pin;}
else {
MKPinAnnotationView *pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
pin.canShowCallout = YES;
pin.image = [UIImage imageNamed:@"Divvy-FB"];
return pin;
}
}
return nil;
}

好的,我想我明白了这个问题,但是我的图钉显示默认的红色,所以我认为我没有让自定义类正确地采用 MKAnnotation 协议(protocol)。我的自定义类 .h 文件如下。我读到 MKAnnotation 协议(protocol)必须实现我添加的坐标属性。有什么我想念的吗?

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>


@interface DivvyStation : NSObject <MKAnnotation>

@property (nonatomic) CLLocationCoordinate2D coordinate;
@property NSNumber *identifier;
@property NSString *stationName;
@property NSNumber *availableDocks;
@property NSNumber *totalDocks;
@property NSNumber *latitude;
@property NSNumber *longitude;
@property NSString *statusValue;
@property NSNumber *statusKey;
@property NSNumber *availableBikes;
@property NSString *streetAddress1;
@property NSString *streetAddress2;
@property NSString *city;
@property NSString *postalCode;
@property NSString *location;
@property NSString *landMark;

@end

最佳答案

您不需要在此方法中遍历所有自行车站点 - 调用它是为了获取特定注释的图钉 View 。您需要检查与传递给此方法的注释相对应的车站的自行车数量。当前编写代码的方式将返回适用于数组中所有注释的第一个站点的 View 。

您会注意到的一件事是 MKAnnotation 是一个协议(protocol),而不是您需要子类化的对象。这意味着您可以让数据模型中的现有对象采用 MKAnnotation 协议(protocol)。

在这种情况下,您可以让您的 DivvyStation 类采用 MKAnnotation 协议(protocol)。那么这将是您的 viewForAnnotation 方法。

   - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation

if ([annotation isKindOfClass:[DivvyStation class]]) {

DivvyStation *divvyStation=(DivvyStation *)annotation

if (divvyStation.availableBikes.intValue < 1) {
MKAnnotationView *pin = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
pin.canShowCallout = YES;
pin.image = [UIImage imageNamed:@"nobikes"];
return pin; }
else if (divvyStation.availableDocks.intValue < 1) {
MKAnnotationView *pin = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
pin.canShowCallout = YES;
pin.image = [UIImage imageNamed:@"dock"];
return pin;}
else {
MKAnnotationView *pin = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
pin.canShowCallout = YES;
pin.image = [UIImage imageNamed:@"Divvy-FB"];
return pin;
}
}
return nil;
}

关于ios - 设置自定义 MKPinAnnotationView 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24103822/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com