如何在 swift 中使用 MapKit 旋转自定义 userLocationAnnotationView 图像?
How to rotate custom userLocationAnnotationView image using MapKit in swift?
我正在尝试找到一种使用 MapKit 在地图上显示用户方向的方法。
执行此操作的原生 MapKit 方法总是旋转整个地图。
由于用户位置也是一个 MKAnnotationView,我决定创建一个特定的 class 来覆盖它并使用特定的图像(带箭头)。
class UserLocationAnnotationView: MKAnnotationView {
override init(frame: CGRect) {
super.init(frame: frame)
}
override init(annotation: MKAnnotation!, reuseIdentifier: String!) {
super.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
var frame = self.frame
frame.size = CGSizeMake(130, 130)
self.frame = frame
self.backgroundColor = UIColor.clearColor()
self.centerOffset = CGPointMake(-30, -50)
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
*/
override func drawRect(rect: CGRect) {
// Drawing code
UIImage(named: "userLocation.png")?.drawInRect(CGRectMake(65, 65, 65, 65))
}
现在我正试图找到一种方法来在 locationManager 的 didUpdateHeading 函数中旋转 MKAnnotationView 图像。
class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {
var userLocationView :MKAnnotationView?
func locationManager(manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
print(newHeading.magneticHeading)
}
newHeading.magneticHeading 的打印效果很好,而且非常准确。
现在如何旋转我的自定义 UserLocationAnnotationView?
感谢您的帮助。
此时我无法为您提供完整的代码示例,但我希望我能为您提供一些指导。
首先,我认为您不一定要继承 MKAnnotationView
。您可以简单地将您的 UIImage
分配给它的 image
属性。我认为这会让事情变得更容易,除非你确实需要定制。
现在,我假设您已成功将注释添加到地图并对其进行引用。
要旋转航向指示器,我看到三个选项:
- 旋转
MKAnnotationView
的 image
属性:
- 方法:当标题改变时,创建
UIImage
的旋转副本并将其分配给image
属性。 Example(未测试)。
- 缺点:无法轻松设置旋转动画。
- 旋转
MKAnnotationView
本身:
- 方法:当标题改变时,用
MKAnnotationView
的/UIView
的transform
property. Assign an appropriate CGAffineTransform
就可以了。
- 专业版:最简单
- 缺点:同时旋转 detail/callout 视图。如果您需要这些,这将不是您的选择。
- 将
UIImage
放入UIImageView
,将add that one as a subview放入MKAnnotationView
:
- 方法:与 2. 类似,但直接在
UIImageView
上使用 transform
属性,而不是在 MKAnnotationView
本身上使用。这样标注视图就不会旋转。
- 亲:应该很好用。
- 缺点:需要多做一些工作。
您还需要:
- 将度数转换为弧度的函数。仿射变换需要弧度。
- 如果您想为旋转设置动画(1 除外),请将更改包装到
UIView
的 static[=70 中的 transform
属性 =] animate
方法。
我正在尝试找到一种使用 MapKit 在地图上显示用户方向的方法。 执行此操作的原生 MapKit 方法总是旋转整个地图。 由于用户位置也是一个 MKAnnotationView,我决定创建一个特定的 class 来覆盖它并使用特定的图像(带箭头)。
class UserLocationAnnotationView: MKAnnotationView {
override init(frame: CGRect) {
super.init(frame: frame)
}
override init(annotation: MKAnnotation!, reuseIdentifier: String!) {
super.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
var frame = self.frame
frame.size = CGSizeMake(130, 130)
self.frame = frame
self.backgroundColor = UIColor.clearColor()
self.centerOffset = CGPointMake(-30, -50)
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
*/
override func drawRect(rect: CGRect) {
// Drawing code
UIImage(named: "userLocation.png")?.drawInRect(CGRectMake(65, 65, 65, 65))
}
现在我正试图找到一种方法来在 locationManager 的 didUpdateHeading 函数中旋转 MKAnnotationView 图像。
class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {
var userLocationView :MKAnnotationView?
func locationManager(manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
print(newHeading.magneticHeading)
}
newHeading.magneticHeading 的打印效果很好,而且非常准确。 现在如何旋转我的自定义 UserLocationAnnotationView?
感谢您的帮助。
此时我无法为您提供完整的代码示例,但我希望我能为您提供一些指导。
首先,我认为您不一定要继承 MKAnnotationView
。您可以简单地将您的 UIImage
分配给它的 image
属性。我认为这会让事情变得更容易,除非你确实需要定制。
现在,我假设您已成功将注释添加到地图并对其进行引用。
要旋转航向指示器,我看到三个选项:
- 旋转
MKAnnotationView
的image
属性:- 方法:当标题改变时,创建
UIImage
的旋转副本并将其分配给image
属性。 Example(未测试)。 - 缺点:无法轻松设置旋转动画。
- 方法:当标题改变时,创建
- 旋转
MKAnnotationView
本身:- 方法:当标题改变时,用
MKAnnotationView
的/UIView
的transform
property. Assign an appropriateCGAffineTransform
就可以了。 - 专业版:最简单
- 缺点:同时旋转 detail/callout 视图。如果您需要这些,这将不是您的选择。
- 方法:当标题改变时,用
- 将
UIImage
放入UIImageView
,将add that one as a subview放入MKAnnotationView
:- 方法:与 2. 类似,但直接在
UIImageView
上使用transform
属性,而不是在MKAnnotationView
本身上使用。这样标注视图就不会旋转。 - 亲:应该很好用。
- 缺点:需要多做一些工作。
- 方法:与 2. 类似,但直接在
您还需要:
- 将度数转换为弧度的函数。仿射变换需要弧度。
- 如果您想为旋转设置动画(1 除外),请将更改包装到
UIView
的 static[=70 中的transform
属性 =]animate
方法。