项目中的几个iOS效果看开发(项目用到,仅供本人理解)

1.判断tableview上拉,下拉效果

UIScrollView的contentOffset,UIScrollViewDelegate的两个方法,scrollviewWillScroll, scrollviewDidScroll.

在scrollviewWillScroll中记下scrollview的contentOffset的y,在scrollviewDidScroll中记下当前contentOffset的y,并比较两个y的大小。(扩展知识:深入理解,frame,bound。contentView,contentOffset,contentInsets的区别)。


2.文字,表情,超链接混排

扩展UILabel,在drawrect方法中用Open GL方法描绘文字,表情,超链接。文字用NSString的drawInRect:withFont, 表情用UIImage的drawInRect,drawAtPoint,(drawInRectCGRect制完整的像,适当地, drawAtPoint利用CGPoint左上角,制完整的不放的,),超链接用Core Graphic画线的方法。

2.1然后把混排的文字进行划分成不同段,放入数组NSArray。划分规则如下

换行符(\r\n, \n)

表情

超链接(用正则表达式可以分析出,电话,邮箱,URL等)

纯文字(没有换行符,表情占位,超链接的文字)

2.2分析NSArray,用换行规则进行排版

用beginPoint(CGPoint)表示下个显示的起始点。

a).遇到换行符,beginPoint.x=0, beginPoint.y = beginPoint.y+ 一行的高度。

b).遇到表情符号,当表情+本行长度> 规定的行的最宽度, beginPoint.x=0, beginPoint.y = beginPoint.y+ 一行的高度,然后drawImageAtPoint。 如果当表情+本行长度<=规定的行的最宽度,直接画。

c).当遇到纯文字时,判断长度是否超过行最宽度,若超过,先画满该行,然后再换行(beginPoint.y= beginPoint.y+一行的高度),再画剩下的文字。(具体的方法可以用stringFromIndex从location 0开始一个个试验,计算出该行最多可以容纳几个字符)。

d).当遇到超链接时,方法和纯文字类似,但同时需要用core graphic划出underline。

当画超链接时,由于超链接有响应点击的功能,所以要记录下,该超链接的区域,当超链接需要换行时,可能有多个矩形区域(CGFrame),所以当点击链接时,要判断点击的CGPoint是否在这多个矩形区域中(CGRectContainPoint)

知识扩展或难点重点:CGLayer中使用Open GL, 换行规则,超链接响应点击事件,判断点在矩形范围内。


3.自定义tabbarconttoller的实现

这个链接有介绍


4.tableviewcell高度的自适应(cell中有UIlabel,UIImageView等)

动态计算Cell中各元素的size,调整各元素的frame(在size基础上调整各元素之间的相对位置),动态计算cell的高度,在HeighForCellAtIndex中返回。背景图片的拉伸。

对于NSString类型,可以用sizeWithFont:constrainedToSize:lineBreakMode:

计算label的size。(不要给UILabel设置numOflines,需设为0)

对于image,可以固定size,也可以通过image的size属性得到大小。 

通过setFram设置每个元素的frame。

背景UIView的颜色可以通过拉伸UIImage来实现,设置UIView的Autosizing属性,image用resizableImageWithCapInsets来拉伸获得。


5.地图缩放功能

6.UIViewController, UINavigationController, TabbarController内部原理


7.coreData在多线程中的使用

注意:每个thread都要有属于自己的managed object context

 Create a separate managed object context for eachthread and share a single persistent store coordinator.This is thetypically-recommended approach.Createa separate managed object context and persistent store coordinator for eachthread.This approach provides for greater concurrency at the expense of greatercomplexity (particularly if you need to communicate changes between differentcontexts) and increased memory usage.


8.实现多线程下载离线包

8.1首先设置下载临时路径,temporaryFileDownloadPath和文件传输结束后的保存路径downloadDestinationPath.下载完毕后,将文件迁移到downloadDestinationPath.

8.2ASIHTTPRequest的 setAllowResumeForFileDownloads:YES. 但是它不是真正意的断点续传。它只能让应用在下载过程中,停和继续。如果退出用再入是无效的。

断点续传的工作原理是temporaryFileDownloadPath的文件的大小,并使用Range: bytes=x HTTP求剩余的文件内容。

http://blog.chinaunix.net/uid-11959329-id-3088466.html


9.KVO,KVC原理和使用

KVO有自动通知,手动通知。自动通知,就是当修改对象属性时,会自动调用observerForKeyPath;手动通知,需要手动调用willChangeValueForKey, didChangeValueForKey,前提是在被观察者中重载automaticallyNotifiesObserversForKey,对于需要手动返回的属性,返回NO。还有一种情况只能用手动通知,而自动通知无法使用的情况是,当改变变量的value(不是属性的value)时。


10.使用CoreData过程


coredata是一个ORM框架。

 

10.1 先手动创建模型文件(后缀xcdatamodelId),通过方法生成NSManagedObjectModel对象。

10.2 通过指定数据文件(xml,sqlite,二进制文件)和model 对象,生成NSPersistentStoreCoordinator对象

10.3通过指定persistent store coordinator对象,生成managedObjectContext。

以上3种对象作用

1.  managed object model将model文件生成model对象

2.  persistent store coordinator将 model对象和数据文件(xml,sqlite等)映射起来,操作model对象就是对数据文件进行I/O操作

3.  managed objectcontext负责管理所有的managed objects,支持undo/redo。


Model文件结构及相关类

Model相当于一个database,里面包括数据表,关系等

NSEntityDescription相当于一个表

NSPropertyDescription相当于表中的一列,或者XML中key-value结构中的key

NSAttributeDescription 存储基本数据类型,如NSString,NSNumber等

NSRetionshipDescription 描述entity和property之间的关系。


11.怎样用coredata进行查询?

查询实际调用select语句,NSFetchRequest(select)+NSEntity(from表)+NSPredict(条件)+NSSortDescriptor(排序)

然后用fetch request controller进行查询,用fetchrequest delegate返回查询结果


12。怎样用coredata进行增删改?

增,NSEntityDescriptor 返回一个对象占位,给对象设置数据,用object context save方法。

删,先用fetch语句查询,然后用object context方法(deleteObject)将object删除,再用save方法。

更新,用save,如果是旧数据就更新,新数据就插入


13.如何subview随父视图大小而自动适应大小?

首先设置父视图的autoresizingSubviews为YES,然后再设置subview的autoresizingMask


14.关于设置背景图片

可以使用UIView的layer属性contents,和backgoundColor设置背景图片。

14.1使用contents属性

实现如下:view2是UIView类型

UIImage* image = [[UIImageimageNamed:@"bubble.png"]resizableImageWithCapInsets:UIEdgeInsetsMake(40,100, 10, 10) resizingMode:UIImageResizingModeStretch];

self.view2.layer.contents =(id)image.CGImage;

view2大小变化时,layer的contents不会局部拉伸,而是整个图片拉伸,原因是拉伸方法是UIImage的,给layer赋值的是CGImage。效果如下:


14.2 使用backgoundColor

实现如下:

self.view2.backgroundColor =[UIColorcolorWithPatternImage:image];

而backgroundColor只是将image复制下来当作一个背景颜色,对image没有任何改变,效果是image重复拼接


14.3要想局部拉伸图片,只能用UIImageView的image属性。(试验imageview的layer,同样会全局拉伸,看来局部拉伸起作用的只有image属性了,要想在imageview里写字怎么办?添加同一级别的UILabel,只是放在imageview的前面了)

[self.imgViewsetImage:image];


16.iOS subView自适应布局(当改变superview时)

默认情况下,当supview改变frame时,subview的大小不会改变,但是left/right/top/bottommargin都会随比例变化(用nib除外,因为nib中默认left/topmargin都是不变的)。

效果如下:



如果想让subview什么都不变(大小,相对于左上角位置不变),不用nib的前提下,怎么办呢?

用UIViewAutoSizingNone(事实上,让superviewsetAutoresizesSubviews为NO,居然也可以实现以下效果,坑爹娘啊,apple为什么搞了这么多希奇古怪的东西,让人困扰啊). 如下


备注:UIViewAutoresizingFlexibleLeftMargin

The view resizes by expanding or shrinking in thedirection of the left margin.

在left margin的方向上,放大或缩小,而不是固定left margin不变,其他也类似,以前搞错了,以为是固定margin。


UIViewAutoresizingFlexibleHeight

随着superview的大小,而改变subview的高度,top/bottom高度不变。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值