gpt4 book ai didi

ios - 为什么 MKOverlayRenderer 上的 drawRect 很慢

转载 作者:行者123 更新时间:2023-12-01 16:39:23 25 4
gpt4 key购买 nike

对于一个应用程序,我必须在 MKMapView 上放置一个 MKCircle 注释。但是,需要移动/调整圆圈的大小。我知道有人问过这个问题,例如Moving MKCircle in MKMapView建议删除/添加注释以获得该行为。

但是,我认为绘图非常慢,就像这篇文章中的用户:Smooth resizing of MKCircle .由于现在有这个问题的答案,这个问题似乎使用 YHAnimatedCircleView .慢的意思是,当我使用 UISlider 更改圆的半径时,重绘是草率的,我还可以注意到用于绘制它的瓷砖。

我创建了一个小测试代码,覆盖 drawMapRect一个子类 MKOverlayRenderer。代码如下:

-(void) drawMapRect:(MKMapRect)mapRect
zoomScale:(MKZoomScale)zoomScale
inContext:(CGContextRef)context
{
MKCircle* circleOverlay = (MKCircle*)self.overlay;

CLLocationCoordinate2D point = circleOverlay.coordinate;

CGPoint locationPoint =
[self pointForMapPoint:MKMapPointForCoordinate(point)];

CGFloat radius =
MKMapPointsPerMeterAtLatitude(circleOverlay.coordinate.latitude) *
circleOverlay.radius;

CGRect circleRect = CGRectMake(locationPoint.x - radius,
locationPoint.y - radius,
radius * 2.0, radius * 2.0);

CGContextSaveGState(context);

CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
CGContextFillEllipseInRect(context, circleRect);

CGContextRestoreGState(context);
}

当我移动 UISlider 时,旧注释被删除,新的 MKCircle放置不同半径的 drawMapRect方法被调用。

然而,即使是这个小例子,在调整圆的大小时也显示出草率的绘图。

问题:
  • 上面的例子是完全正确的还是我在绘画方面做错了什么?
  • 如果示例正确,为什么在调整圆圈大小时重绘圆圈如此缓慢/草率?
  • 最佳答案

    我在 MKMapView 上绘制叠加层时遇到了类似的问题,我的问题是移动我绘制的与 map 相关的圆圈。这导致了 map 移动与圆圈移动相比存在滞后的问题,看起来圆圈似乎​​在 map 顶部滑动,而不是固定在 map 上。

    我的解决方案是使用 CADisplayLink为了同步 MKMapView 的绘图和我添加到其中的任何 View 。我相信这将适用于您使用 UISlider 更改圆半径的原始实现,但是如果没有实现,我无法彻底测试它。

    一个代码示例是这样的:

    - (void)viewDidLoad {
    self.mapUpdateLink = [CADisplayLink displayLinkWithTarget:self
    selector:@selector(updateMapView)];
    [self.mapUpdateLink addToRunLoop:[NSRunLoop mainRunLoop]
    forMode:NSRunLoopCommonModes];
    }

    - (void)updateMapView {
    CGPoint centerPoint = [self.mapView convertCoordinate:self.circleView.centerCoordinate
    toPointToView:self.view];
    if (!isnan(centerPoint.x) && !isnan(centerPoint.y)) {
    self.circleView.center = centerPoint;
    }
    }

    我希望这可以帮助您解决问题。

    关于ios - 为什么 MKOverlayRenderer 上的 drawRect 很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25750758/

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