使用自动布局子类化 MKAnnotationView

Posted

技术标签:

【中文标题】使用自动布局子类化 MKAnnotationView【英文标题】:Subclassing MKAnnotationView with use of auto layout 【发布时间】:2013-01-29 20:11:35 【问题描述】:

我喜欢 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 中缺乏自动布局支持的问题,以便我可以在我的子类中使用自动布局?

【问题讨论】:

我也有同样的问题,你找到解决办法了吗? 最后我在不使用自动布局的情况下重写了整个内容。所以恐怕我没有解决办法。 也许也适合您? ***.com/a/19623817/701900 【参考方案1】:

注释视图的自动布局在 iOS SDK 8 之前运行良好。在 iOS SDK 8 中,我看到带有动态约束的视图的行为非常奇怪,它们在整个地图上移动,有时甚至对齐左上角。

解决方案是setTranslatesAutoresizingMaskIntoConstraints:YES

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

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

【讨论】:

我很惊讶!这实际上奏效了。我使用的是 Masonry,因此将 translatesAutoresizingMaskIntoConstraints 自动设置为 NO,因此我必须在 updateConstraints 结束时手动将其设置为 YES。【参考方案2】:

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

photoViewAddToAnnotationView.translatesAutoresizingMaskIntoConstraints = YES;

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

【讨论】:

【参考方案3】:

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

【讨论】:

我试过了,但这没有用。当覆盖 -layoutSubviews 方法时,我需要调用它的超级方法来自动布局工作。但是由于看起来 MKAnnotationView 实现了自己的 -layoutSubviews 方法而不调用它的 super 调用将永远不会到达 UIView 的 -layoutSubviews 方法,我认为这会导致异常。

以上是关于使用自动布局子类化 MKAnnotationView的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式在子类 UIView 的子视图上自动布局

以编程方式使用自动布局实现带有子视图的 uiview 子类

UITableViewCell 子类布局在禁用自动布局的故事板中搞砸了

如何在不使用自动布局的情况下设置 UISegmentedControl 子类的高度?

具有自动布局约束的 UITableViewCell 子类大小不正确

自动布局动态大小 uitableview 单元格的最佳方法是啥