Jan 3

ios自定义view中和android的区别小记

Lrdcq , 2016/01/03 22:18 , 程序 , 閱讀(3442) , Via 本站原創
半年前在学习android的view与界面构成时,编写过一个小红点控件作为demo(git地址暂无)。如今学习iOS也学到了这一步,于是我将,那一个代码以相同的原理相同的逻辑移植到了iOS上(git地址暂无),练习iOS中的自定义view,同时也以此对比iOS与android的区别。


自定义view,最主要的功能就是绘制view了,在android,绘制view需要重写方法:void onDraw(Canvas canvas)ios对应需要重写方法:- (void)drawRect:(CGRect)rect。少有不同的是,由于java是完全面向对象的,所以android绘制图形是完全基于canvas这个对象的操作。而iOS的绘图api是面向过程的,而且方法返回来的rect其实是绘图的范围,需要通过UIGraphicsGetCurrentContext()获得绘图上下文句柄在进行操作。对于稍复杂的绘图操作,android可以对代码进行再抽象而ios多数只有重新封装函数


图形坐标计算,ios很方便的是所有的坐标都是显示坐标,也就是所谓的dp,而android中涉及到在dp,px之间换算,相对来说坐标计算会更复杂并易出错。除了坐标需要换算和ios的api函数名长度更长,绘图的计算算法的代码几乎一摸一样。


对view布局,android中的布局众所周知,与web界面布局方法很相似,灵活多变,实际布局中多半会和周围的界面有关;而ios就算使用自动布局,界面的排布方法也会单一很多,自动布局不完整的情况下,可以手动重写intrinsicContentSize来给出推荐布局,而在更常见的情况下,直接设置frame出来即可。所以可以看到android自带控件大部分是剧中显示,而以frame为标准的ios自带控件多半以左上角为开始。因此在ios控件编写时,我们就不去计算中点,直接从左上角开始画吧。


触控方面,android中,需要对view添加OnTouchListener,对onTouch返回值中分action进行switch再对应操作。而iOS中需要重写- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event等多个操作对应的方法进行重写,再在其中编写代码......其实并没有本质的区别。android给的event中可以获得touch相对于自己的坐标和相对于屏幕的坐标(px),可以比较方便的技术其中的数据;iOS的event提供方法:locationInView可以计算触摸位置相对于屏幕上任意一个view的相对坐标,这个在实际使用中就超级方便了,好顶赞。


触控事件散播,android的onTouch方法需要返回一个布尔值,来确定是否要把这个event继续玩外传播,而对于一个viewgroup,android遍历触控事件的方法是把触控点上的view触发到最小元素,才一层一层把事件往上返回,直到有人吞掉它为止。而ios中,事件虽然也是由父级分发的,但是并不能告诉父级我到底有没有吃掉这个事件,因此在子view处理touch的同时,父级也会处理,并会在恰当的时候主动拦截。因此,需要别的方法把需要拦截父级触控事件这个信号传出去,并且在父级做手脚。


事件处理,众所周知,android普遍使用的自定义listener机制而ios实用了delegate机制......这两者其实没有本质上的区别。ios可以使用更高级的方式,即KVO监听,不过那更适合重数据的控件而不是重操作的控件,所以并没有使用。


logo