在两个UIView实例之间查找最低共同祖先的最有效方法是什么?

除了实现Lowest Common Ancestor之外,是否可以利用UIKit API来找到它?
NSView具有ancestorSharedWithView:,因此我怀疑此更新可能要早于iOS添加。

我目前正在使用这种快速而肮脏的解决方案,如果给定的 View 不是同级或直接祖先,则效率很低。

- (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项目的单元测试可能会有所帮助)

最佳答案

使用 -isDescendantOfView: 并不太难。

- (UIView *)my_ancestorSharedWithView:(UIView *)aView
{
    UIView *testView = self;
    while (testView && ![aView isDescendantOfView:testView])
    {
        testView = [testView superview];
    }
    return testView;
}

关于ios - 两个 View 之间共享祖先,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22666535/

10-13 09:33