摘要:最近在做一个资讯客户端,用到UIWebview展示一些网页内容,本来想做一个简单的按压效果,发现在css中设置active属性一直不管用。查阅了一下资料,今天发现,要让css active伪类生效,只需要给这个元素的touchstart/touchend绑定一个空的匿名方法即可成功。下面简单以一个文...
阅读全文
摘要:最近做了个有关阅读的应用,使用了自定义字体,学习了一下这方面的知识。1.首先是最简单也普遍的做法,打包内置字符库文件:把字体库文件添加到工程,如font1.ttf添加到工程,然后在工程plist添加一项Fonts provided by application,这是个数组,然后添加key item1...
阅读全文
摘要:LBS模块,首先当然是定位,获取自己所在的位置。主要用到的就是CLLocationManager,实例一个,然后调用startUpdatingLocation即可。其中可以指定精度CLLocationAccuracy等。设置delegate后,它有两个重要的回调:- (void)locationMa...
阅读全文
摘要:之前做了一下相关涂鸦的东西,发现图片处理挺好玩的,就先讲讲马赛克的实现吧。 放大马赛克图片可以看到,可以看到一个个单色的小正方形。所以马赛克其实也就是把某一点的色值填充了它一定范围内的一个正方形,这样看起来就会模糊,但整体还是有一定原来的样子。如图,一张图片可以认为是9*9个色值组成的位图,进...
阅读全文
摘要:在iOS开发中,我们会发现一些偏底层或基础代码是直接可以复用的,当我们换一个项目,改变的只需要是偏上层的业务逻辑代码,所以我们可以把这部分基础代码制作为一个静态库static library,并不断扩展,这样我们重新开发一个新项目,就可以直接引进这个静态库,再添加上层的业务逻辑代码即可,会大大提高我们开发的效率。下面以一个例子说明制作静态库和相关导入的必须操作。假设这个静态库为Commom,新工程为Example。首先,新建一个静态库,如图:点完成后就可以生成一个静态库了。然后把需要添加的基础代码添加就可。然后我们像平时一样建立的工程Example,把Commom.xcodeproj工程直接拖
阅读全文
摘要:首先先简单介绍一下gif的几个算是术语吧:frame(帧):一个gif可以简单认为是多张image组成的动画,一帧就是其中一张图片image.frameCount(帧数): 就是一个gif有多少帧loopCount(播放次数):有些gif播放到一定次数就停止了,如果为0就代表gif一直循环播放。delayTime(延迟时间):每一帧播放的时间,也就是说这帧显示到delayTime就转到下一帧。所以gif播放主要就是把每一帧image解析出来,然后每一帧显示它对应的delaytime,然后再显示下一张。如此循环下去。下面是纯粹实现由系统提供的解码:-(void)decodeWithFilePat
阅读全文
摘要:KVC,即Key-Value Coding,键值编码,简单地说,就是可以由key获取一个object对应的property。举个例子,如果一个对象object,它有一个属性item,你可以通过valueForKey也可以通过object.item来获取它,同时它支持纵调用,即假如object有个属性是个item,item有个属性score,可以通过@“item.score”获取,setValueForKey同理。 CGFloat valueScore,score,valueTotal,total; TestObject *object = [[TestObject alloc] in...
阅读全文
摘要:Objective-C跟C最大的差别,应该是动态定型(dynamicaly typed),支持在运行时动态类型决议(dynamic typing),动态绑定(dynamic binding)以及动态装载(dynamic loading)。Objective-C 在运行时可以允许根据字符串名字来访问方法和类,还可以动态连接和添加类,而C语言编译时静态绑定,甚至很多时候你没定义的方法直接就编译不过。Message Messaging是Object-C动态定型的实现方法。当调用一个类方法时,系统就给这个对象发消息: objc_msgSend(receiver, selector, arg1,...
阅读全文
摘要:RunLoop这个东西,其实我们一直在用,但一直没有很好地理解它,或者甚至没有知道它的存在。RunLoop可以说是每个线程都有的一个对象,是用来接受事件和分配任务的loop。永远不要手动创建一个runloop,它是跟随着每个线程的。一个RunLoop接收两种source的事件:input source和timer source。同时必须知道的是,input source,runloop是异步交付的,而timer source是同步交付的。每个runloop都有一个RunLoop Modes,代表它以何种方式执行。 我们为什么从来没有感觉到runloop的存在呢,是因为当程序启动,系统默认...
阅读全文
摘要:iOS7.0增加了AirDrop功能,可知在未来,手机信息资源的直接分享会越来越重要。而我们在iPhone系统短信点击照片会看到右上角的分享按钮,点击可以弹出一系列的应用菜单,允许用户把这张图片分享到其他应用。下面谈谈怎样让自己的应用出现在这个全局菜单。当然,这要应用内部手动设置支持。如图:(7.0的分享菜单)(在IOS6.0分别在message和safari支持的全局分享调用)设定应用支持的全局分享设置,在plist添加下面代码: CFBundleDocumentTypes CFBundleTypeName ShareIm...
阅读全文
摘要:iOS开发,最郁闷的莫过于程序毫无征兆地就崩溃了,用bt命令打出调用栈,给出的是一堆系统EXC_BAD_ACCESS的信息,根本没办法定位问题出现在哪里。通常这样的崩溃出现,原因一般就是:调用了已经释放的内存空间,或者说重复释放了某个地址空间。而怎样定位到这个地址呢,可以通过编辑xcode的scheme,添加如下标记位,让系统把错误地址打印出来,如图:(通过Product->Scheme->Edit Scheme进入下面编辑页面,选中Arguments tab,增加标计位NSZombieEnabled设为YES)这样,但崩溃出现,系统会出现以下提示信息:2013-06-23 00:
阅读全文
摘要:最近在忙着一个国外项目,天天加班,没时间更新博客。就简单讲讲国际化的知识。 首先,我们使用字符串,必须用NSLocalizedString(key,comment),这样我们在不同的Localizable.strings对key指定不同的值,系统会根据当前系统语言,去不同的lproj找不同的字符串。用个图显示吧:我们应用只支持中文,英文,所以只建了zh-Hans.lproj和en.lproj,然后在Localizable.strings指定了不同的值。举例如下:这样程序就能根据系统语言,去选择“登录”还是“Log In”。 但是如果每次加了一个本地化字符串,就得手动去Localiz...
阅读全文
摘要:iOS基础界面就是通过UIViewController展示的。首先区分content controller和container controller的区别。content controlller就是展示我们当前页面的controller,而container controller就是一个管理content controller的容器,基本就是UINavigationController和UITabbarController,本身它也是继承UIViewController,一个UIViewController压栈就是把它加入到container controller的view上。下面说一下UIV
阅读全文
摘要:可以知道的是,iphone设备在通话或录音状态中,状态栏下移了20个像素,这时controller的view的frame的高度就减少了20个像素,所以我们需要根据view的frame去布局子view。但是可恨的是,当状态栏还原回去的时候,系统并没有帮我们还原回去。试了一下微信跟陌陌,都有这个问题:(下面暴露的有关人员,不是故意的哈,不要追究我的责任) 看了一下UIViewController的api,发现在ios5.0以后多增加了两个函数:- (void)viewWillLayoutSubviews - (void)viewDidLayoutSubviews 试了一下,发现如果一个Contr.
阅读全文
摘要:有时候UI给的背景都是一张图,而我们并不想刻意去插入一个UIImageView作为背景,这里就直接可以用一张图来填充背景: UIImage *bgImage = [UIImageimageWithContentsOfFile:@"...\background.png"]; UIColor *bgColor = [UIColor colorWithPatternImage:bgImage]; self.backgroundColor =bgColor;但是如果在4.3系统,如果这张背景图是有阴影或透明效果,就会看到透明或阴影的地方变成黑色了。所以需要手动设置一下不透明度: s
阅读全文
摘要:今天仔细看了一下UIView和UIResponder的介绍,着重看了一下hitTest的介绍。首先是官方的:-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event1.我们都知道,一个屏幕事件由响应链一步步传下去。这个函数返回的view就是可以让你决定在这个point的事件,你用来接收事件的view。当然,如果这个point不在你的view的范围,返回nil。2.这个函数忽略userInteractionEnabled,hidden,alpha<0.01,也就是你一个view隐藏或什么了,还是可以作为接收者。3.调用次序是从
阅读全文
摘要:因为emoji编码在android或者pc设备没有很好的支持,所以有时候为了禁止emoji表情的输入,因为关闭不了系统emoji的键盘,那只能根据编码把emoji表情过滤掉,写了一个NSString的拓展,用来判断是不是emoji编码:@implementation NSString(Emoji)+(BOOL)isContainsEmoji:(NSString *)string { __block BOOL isEomji = NO; [string enumerateSubstringsInRange:NSMakeRange(0, [string length]) options:N...
阅读全文
摘要:最近做应用用到定位,位置信息可以很容易由CLLocationManager得到(得到的经纬度在中国有偏移,需要纠偏)。但是怎么把特定经纬度的位置信息得到呢,查看了一下资料,发现了CLGeocoder这个类,可以把经纬度反转为位置信息。代码如下:-(void)reverseGeocodeForLocation:(CLLocationCoordinate2D)coordinate{ CLLocation *loacation = [[[CLLocation alloc] initWithLatitude:coordinate.latitudelongitude:coordinate.longit.
阅读全文
摘要:在iOS6.0以下,当系统收到内存警告,会先调- (void)didReceiveMemoryWarning ,不在当前页面的controller会继续调- (void)viewDidUnload 去释放不必要的view,所以我们可以在viewDidUnload把某些子view释放以回收内存。但是在iOS6.0以上,controller只会收到didReceiveMemoryWarning,不再调用viewDidUnload,也就是苹果不会去主动释放view。所以我们可以封装以下,让6.0以上和以下版本收到内存警告都统一调一个函数,以用来释放子view。代码如此:写一个基类BaseViewCo
阅读全文
摘要:我们都知道,在iOS 6.0以下,支持旋屏的函数如下:- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation我们只要对不同的interfaceOrientation返回YES或NO即可支持对应的屏幕旋转。在6.0以后,旋转函数改为:- (NSUInteger)supportedInterfaceOrientations需要自己返回对应的orientations。但是在实践中发现,当个controller的supportedInterfaceOrientations根本
阅读全文