使用自动布局对MKAnnotationView进行子类化

时间:2013-01-29 20:11:35

标签: iphone ios mapkit mkannotationview autolayout

我喜欢iOS 6中新的自动布局功能,但在与MKAnnotationView子类结合使用时遇到了一些麻烦。

我在初始化方法中禁用了自动调整掩码转换。

self.translatesAutoresizingMaskIntoConstraints = NO;

但是当我加载使用我的子类注释的MKMapView时,应用程序抛出一个NSInternalInconsistencyException。

*** Assertion failure in -[ENMapAnnotationView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2372/UIView.m:5776
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. ENMapAnnotationView's implementation of -layoutSubviews needs to call super.'

我没有覆盖-layoutSubviews,所以对我来说,看起来Apple的MKAnnotationView实现还没有为自动布局做好准备。 有没有一些聪明的方法来解决MKAnnotationView中缺少自动布局支持的问题,所以我可以在我的子类中使用自动布局?

3 个答案:

答案 0 :(得分:6)

注释视图的AutoLayout工作正常,直到iOS SDK 8.使用iOS SDK 8,我看到了具有动态约束的视图的奇怪行为,它们在整个地图上移动,有时甚至在左上角对齐。

解决方案是setTranslatesAutoresizingMaskIntoConstraints:YES

[annotationView setBounds:CGRectMake(0, 0, width, height)];

并使用从子视图计算的宽度和高度。那么至少你可以使用子视图的约束。

答案 1 :(得分:4)

请勿禁用ENMapAnnotationView的translatesAutoresizingMaskIntoConstraints(否则您将错过Pin)。 并确保启用要添加到ENMapAnnotationView的视图的translatesAutoresizingMaskIntoConstraints !!!

photoViewAddToAnnotationView.translatesAutoresizingMaskIntoConstraints = YES;

就是这样!我们不需要关闭自动布局(关闭自动布局也可以解决问题'

答案 2 :(得分:-1)

可能你必须在ENMapAnnotaitonView类中实现 - (void)layoutSubviews方法。