图像无法在自定义MKOverlayRenderer(RubyMotion)中工作

时间:2014-06-27 17:06:58

标签: rubymotion

我在控制器中有一个带有MKMapView的RubyMotion应用程序,我正在尝试添加图像叠加层。

我在这里添加叠加层(MKMapView实例的委托设置为控制器本身):

image = UIImage.imageNamed("map").CGImage 
lowerLeft = CLLocationCoordinate2DMake(21.652538062803, -127.620375523875420)
upperRight = CLLocationCoordinate2DMake(50.406626367301044, -66.517937876818)

overlay = ImageOverlay.alloc.initWithImageData image, withLowerLeftCoordinate:lowerLeft,   withUpperRightCoordinate:upperRight
self.view.addOverlay overlay

这是我的自定义叠加层:

class ImageOverlay
  attr_accessor :imageData
  attr_accessor :mapRect

  def initWithImageData imageData, withLowerLeftCoordinate:lowerLeftCoordinate, withUpperRightCoordinate:upperRightCoordinate
    self.imageData = imageData

    lowerLeft = MKMapPointForCoordinate(lowerLeftCoordinate)
    upperRight = MKMapPointForCoordinate(upperRightCoordinate)

    self.mapRect = MKMapRectMake(lowerLeft.x, upperRight.y, upperRight.x - lowerLeft.x, lowerLeft.y - upperRight.y)

    return self
  end

  def coordinate
    return MKCoordinateForMapPoint(MKMapPointMake(MKMapRectGetMidX(self.mapRect), MKMapRectGetMidY(self.mapRect)))
  end

  def boundingMapRect
    return self.mapRect
  end
end

这是自定义的MKOverlayRenderer:

class ImageOverlayRenderer < MKOverlayRenderer

  def drawMapRect mapRect, zoomScale:zoomScale, inContext:context

    puts "drawMapRect"

    theMapRect = self.overlay.boundingMapRect
    theRect = self.rectForMapRect(theMapRect)

    CGContextScaleCTM(context, 1.0, -1.0)
    CGContextTranslateCTM(context, 0.0, -theRect.size.height)

    CGContextDrawImage(context, theRect, self.overlay.imageData)
  end
end

在我的视图控制器中,我重写了mapView:rendererForOverlay方法:

def mapView mapView, rendererForOverlay:overlay

  if overlay.isKindOfClass(ImageOverlay)
    renderer = ImageOverlayRenderer.alloc.initWithOverlay overlay
    return renderer
  end

  return nil
end

问题是drawMapRect永远不会被调用,应用程序崩溃时没有错误,除非声明可能已生成崩溃报告,其中包含:

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000000000000

在此之前其他所有内容似乎都在运行,mapView:rendererForOverlay被调用并且我将返回渲染器。我甚至覆盖canDrawMapRect并且正在调用它。

有关如何使其发挥作用的任何想法?

1 个答案:

答案 0 :(得分:0)

问题与RubyMotion中的错误有关,已经修复并将在下一个版本中提供:

http://hipbyte.myjetbrains.com/youtrack/issue/RM-533

更新:修复程序已在RubyMotion 2.31中发布,我已经验证它可以解决我的问题。