gpt4 book ai didi

objective-c - MKMapView 中的奇怪行为 - 引脚消失

转载 作者:可可西里 更新时间:2023-11-01 03:58:24 25 4
gpt4 key购买 nike

在我的应用程序中,我们有一个带有 MKMapView 的屏幕。

这张 map 显示了一堆位置的图钉(位置是在应用程序中定义的模型)。

在模拟器中运行时效果很好。但是,在设备上运行时,几乎每次平移 map 时,图钉似乎都会消失并重新出现。即使是轻微的触摸和移动也会导致 map 显示和隐藏图钉。

map 不是特别忙,即使显示一个图钉,它也会显示和隐藏它。

有人知道为什么会这样吗?我在下面粘贴了我的代码...这是一个 Rubymotion 应用程序,所以代码是用 Ruby 编写的。

-更新-

我在下面添加了与此 Ruby 代码等效的 Objective C。如果有一些拼写错误或惯用语错误,我深表歉意,我已经有一段时间没有写任何 OC 了。

- 更新 2 -

观察记录器,我可以看到每次 map 图钉消失/重新出现时都会调用 mapView:viewForAnnotation

而且每次 mapView:regionDidChangeAnimated 我都可以看到注释的对象 ID 是相同的 - 所以我认为它们没有被删除(它们不应该被删除)

# ====================
# = MKMapKitDelegate =
# ====================

# Don't react if the user has moved less than three meters
USER_MOVE_THRESHOLD = 3

# The user location has changed
def mapView(mapView, didUpdateUserLocation: newLocation)
NSLog("mapView:didUpdateUserLocation")
return unless userLocation
coord = newLocation.coordinate
newLocationAsCL = CLLocation.alloc.initWithCoordinate(coord, altitude: 1, horizontalAccuracy:1, verticalAccuracy: -1, timestamp: nil)
meters = newLocationAsCL.distanceFromLocation(@lastUserCLLocation)

# If user has moved less than 3m, return
if meters > 0 and meters < USER_MOVE_THRESHOLD
log "Distance was less than #{USER_MOVE_THRESHOLD} meters (#{meters}) - returning ***"
return
end

# If the coord is the same as the previous user location
if userLocation.coordinate.latitude == coord.latitude && userLocation.coordinate.longitude == coord.longitude
log "User hasn't moved - returning ***"
else
log 'User has moved'
end

log "Did update user location: #{coord.latitude},#{coord.longitude}"

if coord.latitude.to_f == 0.0 and coord.longitude.to_f == 0.0
log 'Invalid coordinate received - returning ***'
else
fetchLocationsFromAPI
end
end

def mapView(mapView, regionDidChangeAnimated: animated)
NSLog("mapView:regionDidChangeAnimated:#{animated}")
# do nothing here yet...
end

# create map pins...
def mapView(mapView, viewForAnnotation: annotation)
log "mapView:viewForAnnotation: #{annotation.inspect}"

if annotation.is_a?(Location)
# If there's already an annotation we can use, use it! Otherwise create a new one
annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(annotation.class.to_s) || begin
annotationView = MKPinAnnotationView.alloc.initWithAnnotation(annotation, reuseIdentifier: annotation.class.to_s)
annotationView.enabled = true
annotationView.canShowCallout = true
annotationView.animatesDrop = false
annotationView.pinColor = MKPinAnnotationColorRed

rightButton = UIButton.buttonWithType(UIButtonTypeDetailDisclosure)
rightButton.addTarget(self, action: 'showLocationScreen:', forControlEvents: UIControlEventTouchUpInside)
annotationView.rightCalloutAccessoryView = rightButton
annotationView
end
annotationView.annotation = annotation
annotationView.rightCalloutAccessoryView.tag = @mapLocations.index(annotation)
return annotationView
end
end

def mapView(mapViewm, didAddAnnotationViews: views)
NSLog("mapView:didAddAnnotationViews - #{views}")
# do nothing here yet...
end

objective-c

#define kUserMoveThreshold 1

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)newLocation
{
NSLog(@"mapView:didUpdateUserLocation")
if (!userLocation) {
return;
}
CLLocationCoordinate2D coord = newLocation.coordinate;
CLLocation newLocationAsCL = [[CLLocation alloc] initWithCoordinate: coord altitude: 1 horizontalAccuracy: 1 verticalAccuracy: -1 timestamp: NULL];
CLLocationDistance meters = [newLocationAsCL distanceFromLocation: lastUserCLLocation];

// If user has moved less than 3m, return
if (meters > 0 && meters < kUserMoveThreshold){
NSLog(@"Distance was less than %d meters (%d) - returning ***", kUserMoveThreshold, meters);
return;
}

// If the coord is the same as the previous user location
if (userLocation.coordinate.latitude == coord.latitude && userLocation.coordinate.longitude == coord.longitude){
NSLog(@"User hasn't moved - returning ***");
return;
} else {
NSLog(@"User has moved");
}
NSLog(@"Did update user location: %f,%f", coord.latitude, coord.longitude);
if (coord.latitude == 0.0 && coord.longitude == 0.0){
NSLog(@"Invalid coordinate received - returning ***");
} else {
[self fetchLocationsFromAPI];
}
}

-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
NSLog(@"mapView:regionDidChangeAnimated: %s", animated ? @"TRUE" : @"FALSE");
}

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id < MKAnnotation >)annotation
{
NSLog(@"mapView:viewForAnnotation %s", annotation.description);

if ([annotation isKindOfClass: [Location class]]){
// If there's already an annotation we can use, use it! Otherwise create a new one
MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier: [annotation className]];
if (!annotationView){
annotationView = [[MKPinAnnotationView alloc] initWithAnnotation: annotation reuseIdentifier: [annotation className]];
[annotationView setEnabled: YES];
[annotationView setCanShowCallout: YES];
[annotationView setAnimatesDrop: NO];
[annotationView setPinColor: MKPinAnnotationColorRed];

UIButton *rightButton = [UIButton buttonWithType: UIButtonTypeDetailDisclosure];
[rightButton addTarget: self action: @selector(showLocationScreen:) forControlEvents: UIControlEventTouchUpInside];
[annotationView setRightCalloutAccessoryView: rightButton];
}

[annotationView annotation: annotation];
[[annotationView rightCalloutAccessoryView] setTag: [mapLocations indexOfObject: annotation]];
return annotationView
}
}

-(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views
{
NSLog(@"mapView:didAddAnnotationViews %@", views)
}

最佳答案

这是 Rubymotion 的一个错误,似乎已在 1.30 版中解决

= RubyMotion 1.30 =

...

  • 修复了 MapKit 注释图钉会消失的错误,因为某些Ruby 对象(在本例中为 MKAnnotations)将使用 Bignum 值作为`hash' 方法的返回值,使用时不能正常工作在 MapKit 中。

...

关于objective-c - MKMapView 中的奇怪行为 - 引脚消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13258000/

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