使用自动布局子类化 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的主要内容,如果未能解决你的问题,请参考以下文章
UITableViewCell 子类布局在禁用自动布局的故事板中搞砸了
如何在不使用自动布局的情况下设置 UISegmentedControl 子类的高度?