gpt4 book ai didi

ios - MKPinAnnotationView subview 不更新

转载 作者:行者123 更新时间:2023-11-28 20:14:28 25 4
gpt4 key购买 nike

我正在开发一个使用自定义 AnnotationView 的应用程序。它有一个自定义图像和一个带有标签的背景。背景和标签是annotationView的子View。

if ([annotation isKindOfClass:[VehicleAnnotation class]]) {
VehicleAnnotation *vehicleAnnotation = annotation;

MKPinAnnotationView *pinView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:driverAnnotationIdentifier];
if(!pinView)
{
pinView = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:driverAnnotationIdentifier];
}

pinView.annotation = annotation;

pinView.canShowCallout = NO;
pinView.image = [ImageHelper imageForStatus:vehicleAnnotation.vehicle.driver.driverStatus];

// Add a label with the name of the driver
CGRect pinFrame = pinView.frame;
UILabel *label = [[UILabel alloc] init];
[label setBackgroundColor:[UIColor clearColor]];
[label setTextColor:[UIColor whiteColor]];
[label setNumberOfLines:2];
[label setLineBreakMode:NSLineBreakByWordWrapping];
[label setFont:[UIFont systemFontOfSize:12]];
label.text = vehicleAnnotation.vehicle.driver.description;

CGSize maximumSize = CGSizeMake(100, 50);
CGSize myStringSize = [label.text sizeWithFont:label.font
constrainedToSize:maximumSize
lineBreakMode:label.lineBreakMode];

CGRect labelFrame = CGRectMake(pinFrame.origin.x, pinFrame.origin.y + pinFrame.size.height * 2 + 2, myStringSize.width, myStringSize.height);
[label setFrame:labelFrame];

// Add a background to the label.
CGFloat offset = 5;
CGRect backgroundFrame = CGRectMake(labelFrame.origin.x - offset, labelFrame.origin.y - offset , labelFrame.size.width + 2 * offset, labelFrame.size.height + 2 * offset);
UIView *backgroundView = [[UIView alloc] initWithFrame:backgroundFrame];
backgroundView.layer.cornerRadius = 5;
backgroundView.layer.masksToBounds = YES;
[backgroundView setBackgroundColor:[UIColor darkGrayColor]];
[backgroundView setAlpha:0.8];
[pinView addSubview:backgroundView];

[label setUserInteractionEnabled:YES];
[label setMultipleTouchEnabled:YES];
[pinView addSubview:label];

return pinView;
}

每次收到新位置时都会执行此代码。问题是旧标签和旧背景仍然存在。所以我想我把这段代码:

MKPinAnnotationView *pinView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:driverAnnotationIdentifier];
if(!pinView)
{
pinView = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:driverAnnotationIdentifier];
}
for(UIView *view in [pinView subviews])
{
[view removeFromSuperview];
}
pinView.annotation = annotation;

但是没有显示标签或背景。有人可以帮我以适当的方式替换或删除背景和标签吗?

谢谢!

最佳答案

我建议制作您自己的自定义 MKAnnotatinView。否则使用上面的代码,尝试在分配初始化 MKAnnotationView 的 block 中添加标签和背景 View 。设置框架和文本以及其他属性,这些属性会随着 block 外的不同注释而变化,如下所示。

if ([annotation isKindOfClass:[VehicleAnnotation class]]) {
VehicleAnnotation *vehicleAnnotation = annotation;

MKPinAnnotationView *pinView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:driverAnnotationIdentifier];
if(!pinView)
{
pinView = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:driverAnnotationIdentifier];
UILabel *label = [[UILabel alloc] init];
[label setBackgroundColor:[UIColor clearColor]];
[label setTextColor:[UIColor whiteColor]];
[label setNumberOfLines:2];
[label setLineBreakMode:NSLineBreakByWordWrapping];
[label setFont:[UIFont systemFontOfSize:12]];
[label setUserInteractionEnabled:YES];
[label setMultipleTouchEnabled:YES];
[label setTag:101];

UIView *backgroundView = [[UIView alloc]init];
[backgroundView setTag:102];
backgroundView.layer.cornerRadius = 5;
backgroundView.layer.masksToBounds = YES;
[backgroundView setBackgroundColor:[UIColor darkGrayColor]];
[backgroundView setAlpha:0.8];
[pinView addSubView:backgroundView];
[pinView addSubview:label];



}

pinView.annotation = annotation;

pinView.canShowCallout = NO;
pinView.image = [ImageHelper imageForStatus:vehicleAnnotation.vehicle.driver.driverStatus];

// set frame of Label
CGRect pinFrame = pinView.frame;
UILabel *label = (UILabel *)[pinView viewWithTag:101];
label.text = vehicleAnnotation.vehicle.driver.description;

CGSize maximumSize = CGSizeMake(100, 50);
CGSize myStringSize = [label.text sizeWithFont:label.font
constrainedToSize:maximumSize
lineBreakMode:label.lineBreakMode];

CGRect labelFrame = CGRectMake(pinFrame.origin.x, pinFrame.origin.y + pinFrame.size.height * 2 + 2, myStringSize.width, myStringSize.height);
[label setFrame:labelFrame];

// set backgroundView frame.
CGFloat offset = 5;
CGRect backgroundFrame = CGRectMake(labelFrame.origin.x - offset, labelFrame.origin.y - offset , labelFrame.size.width + 2 * offset, labelFrame.size.height + 2 * offset);
UIView *backgroundView = [pinView viewWithTag:102];
[backgroundView setFrame:backgroundFrame];

return pinView;
}

关于ios - MKPinAnnotationView subview 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18574829/

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