【发布时间】:2014-05-05 04:22:16
【问题描述】:
在两个UIView 实例之间找到最低共同祖先的最有效方法是什么?
没有实现Lowest Common Ancestor,是否有任何UIKit API 可以用来找到它?
NSView 有 ancestorSharedWithView:,所以我怀疑这可能迟早会添加到 iOS。
我目前正在使用这种快速而肮脏的解决方案,如果给定的视图不是同级或直接祖先,则效率很低。
- (UIView*)lyt_ancestorSharedWithView:(UIView*)aView
{
if (aView == nil) return nil;
if (self == aView) return self;
if (self == aView.superview) return self;
UIView *ancestor = [self.superview lyt_ancestorSharedWithView:aView];
if (ancestor) return ancestor;
return [self lyt_ancestorSharedWithView:aView.superview];
}
(对于那些实现类似方法的人,Lyt 项目的单元测试可能会有所帮助)
【问题讨论】:
-
您唯一的选择是将
superview链向上移动到顶部,然后找到两个分歧点。我不知道有任何 API(superview除外)会有所帮助。 -
我不了解 API,但我不会一直走到顶峰;而是以交替方式上升,为我找到的每个 UIView 保留一个计数器,并在每次访问它时将该计数器增加 1。第一个将计数器设置为 2 的 UIView 是最低的共同祖先。例如,您可以使用 hashmap 将视图映射到它们的计数器。这是我能想到的最简单的事情,实施起来也不难。
标签: ios algorithm uiview uikit