新技能

#pragma mark --寻找最近公共view

+ (NSArray *)superViews:(UIView *)view{

if (view==nil) {

return @[];

}

NSMutableArray *result = [NSMutableArray array];

while (view!=nil) {

[result addObject:view];

view = view.superview;

}

return [result copy];

}

//然后对于两个ViewA,viewB,我们可以得到两个路径,找到的是最近的一个公共节点。

//一个简单直接的方法:拿第一个路径中的所有节点,去第二个节点中查找。假设路的平均长度是N,因为每个节点都要找N次,一共有N个节点,所以这个方法的时间复杂度O(N^2)

+ (UIView *)commonView_1:(UIView *)viewA  andView:(UIView *)viewB{

NSArray *arr1 = [self superViews:viewA];

NSArray *arr2 = [self superViews:viewB];

for (NSUInteger i =0; i<arr1.count; ++i) {

UIView *targetView = arr1[i];

for (NSUInteger j=0; j<arr2.count; ++j) {

if (targetView == arr2[j]) {

return targetView;

}

}

}

return nil;

}

//一个改进的办法:我们将一个路径中的所有点先放进NSSet中.因为NSSet的内部实现是一个hash表,所以查询元素的时间的复杂度变成O(1),我们一共有N个节点,所以总时间复杂度优化到了O(N)

+ (UIView *)commomView_2:(UIView *)viewA andView:(UIView *)viewB{

NSArray *arr1 = [self superViews:viewA];

NSArray *arr2 = [self superViews:viewB];

NSSet *set = [NSSet setWithArray:arr2];

for (NSUInteger i =0; i<arr1.count; ++i) {

UIView *targetView = arr1[i];

if ([set containsObject:targetView]) {

return targetView;

}

}

return nil;

}

//除了使用NSSet外,我们还可以使用类似归并排序的思想,用两个指针,分别指向两个路径的根节点,然后从根节点

+ (UIView *)commonView_3:(UIView *)viewA andView:(UIView *)viewB{

NSArray *arr1 = [self superViews:viewA];

NSArray *arr2 = [self superViews:viewB];

NSInteger p1 = arr1.count -1;

NSInteger p2 = arr2.count -1;

UIView *answer = nil;

while (p1>=0&p2>=0) {

if (arr1[p1]==arr2[p2]) {

answer = arr1[p1];

}

p1--;

p2--;

}

return answer;

}

iOS开发寻找最近公共view的更多相关文章

  1. iOS 面试题(一):寻找最近公共 View --转自唐巧

    题目:找出两个 UIView 的最近的公共 View,如果不存在,则输出 nil . 分析:这其实是数据结构里面的找最近公共祖先的问题. 一个 UIViewController 中的所有 view 之 ...

  2. 全面理解iOS开发中的Scroll View[转]

    from:http://mobile.51cto.com/hot-430409.htm 可能你很难相信,UIScrollView和一个标准的UIView差异并不大,scroll view确实会多一些方 ...

  3. iOS开发-简单获取View截图图像(Quartz2D)

    1. 先指定图像的大小 UIGraphicsBeginImageContext(view.frame.size); 2. 在指定的区域绘制图像 [view drawViewHierarchyInRec ...

  4. ios开发之--为父view上的子view添加阴影

    项目中碰到一个问题,在tableview的headerview里面有很一个子view,设计师的要求是在下方添加一个阴影,效果如下: 以前的实现思路就是,代码如下: 添加阴影 调用视图的 layer C ...

  5. iOS开发技巧

    一.寻找最近公共View 我们将一个路径中的所有点先放进 NSSet 中.因为 NSSet 的内部实现是一个 hash 表,所以查找元素的时间复杂度变成了 O(1),我们一共有 N 个节点,所以总时间 ...

  6. IOS开发之简单音频播放器

    今天第一次接触IOS开发的UI部分,之前学OC的时候一直在模拟的使用Target-Action回调模式,今天算是真正的用了一次.为了熟悉一下基本控件的使用方法,和UI部分的回调,下面开发了一个特别简易 ...

  7. IOS 开发中 Whose view is not in the window hierarchy 错误的解决办法

    在 IOS 开发当中经常碰到 whose view is not in the window hierarchy 的错误,该错误简单的说,是由于 "ViewController" ...

  8. iOS开发UI篇—控制器的View的创建

    iOS开发UI篇—控制器的View的创建 一.6种创建控制器View的方式 #import "NJAppDelegate.h" #import "NJViewContro ...

  9. iOS开发UI篇—使用picker View控件完成一个简单的选餐应用

    iOS开发UI篇—使用picker View控件完成一个简单的选餐应用 一.实现效果 说明:点击随机按钮,能够自动选取,下方数据自动刷新. 二.实现思路 1.picker view的有默认高度为162 ...

随机推荐

  1. jquery实现全选、全不选、反选、获取选中的所有值总结

    HTML 我们的页面上有一个歌曲列表,列出多行歌曲名称,并匹配复选框供用户选择,并且在列表下方有一排操作按钮. <!doctype html> <html> <head& ...

  2. jQuery中.bind() .live() .delegate() .on()的区别 和 三种方式写光棒事件 动画

    地狱的镰刀 bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数. $("a").bind("click",function(){ ...

  3. ThinkPHP5.0学习1 — 命名空间

    定义命名空间:namespace sp1: 访问命名空间:\sp1\somefunction(); 非限定名称访问方式     //访问当前命名空间内容:somefunction(); 限定名称访问方 ...

  4. muduo库整体架构简析

    muduo是一个高质量的Reactor网络库,采用one loop per thread + thread loop架构实现,代码简洁,逻辑清晰,是学习网络编程的很好的典范. muduo的代码分为两部 ...

  5. Javascript中好用更改时间的方法

    <script type="text/javascript"> //格式化时间格式的字符串 String.prototype.myTimes = function () ...

  6. Redis从入门到精通

    什么是Redis? Redis是非关系型数据库,是一个高性能的key-value数据库,它是开源的,更是免费的. Redis能做什么? 存储数据 Redis的优点有哪些? 1.它支持存储丰富的数据类型 ...

  7. centOS7 mini配置linux服务器(二) 配置IP

    1.登录root用户,输入指令  #ip addr 可以看到除lo外的属于你的网卡配置. 2.输入 #cd /etc/sysconfig/network-scripts/         #vi if ...

  8. [HDU1210] Eddy's 洗牌问题

    Problem Description Eddy是个ACMer,他不仅喜欢做ACM题,而且对于纸牌也有一定的研究,他在无聊时研究发现,如果他有2N张牌,编号为1,2,3..n,n+1,..2n.这也是 ...

  9. Python 引用、浅拷贝、深拷贝解析

    引用 Python是动态数据类型的语言,故在对变量进行赋值时是不用制定变量类型的. 或者说,你可以把变量赋值的过程,当作是贴一个标签,去引用该数据. 看下面的例子: In [54]: a=4 In [ ...

  10. ASP提取字段中的图片地址

     Function RegImg(TheStr)     Dim RegEx     Set RegEx = New RegExp '建立正则表达对象.     RegEx.IgnoreCase =T ...