使用Quartz 2D实现径向渐变
由于项目原因,需要实现一个雷达图,图上的线条颜色需要从内向外渐变,外圈上的点的颜色随当前部分所处区域不同而显示不同颜色。成果图如下,还未实现将折线变成曲线: 线条和点都是使用UIBezierPath绘制,对于普通的绘图UIBezierPath就足够了,而且比较易于理解,绘图都在layer层完成。 轴向渐变与径向渐变 轴向渐变(Axial,也称为线性渐变) 轴向渐变就是从一个点到另一个点的轴线渐变,所有位于垂直于轴线的某条线上的点都具有相同的值,在iOS中实现起来也是非常的简单。只需要一个在CALayer上封装好的CAGradientLayer就可以了,CAGradientLayer已经为我们封装好了渐变的方法,我们只需要指定需要的颜色,每种颜色的位置点,之后的渐变就交给系统处理。但是目前提供的字段比较少,开发者能自定义的也比较少。目前的CAGradientLayer虽然提供了type字段,但是坑爹的只支持轴向渐变,不支持径向渐变 /*...
《iOS进阶》-开发技巧
收起键盘 在UIViewController中收起键盘,除了调用相应控件的resignFirstResponder方法外,还有另外三种方法。 重载touchesBegin方法,在里面执行[self.view endEditing:YES];这样单击UIViewController的任意地方就可以收起键盘。 在获得当前UIViewController比较困难时,可以直接执行 [[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];。 直接执行[[[UIApplication sharedApplication] keyWindow] endEditing:YES];。 设置应用内的系统控件语言 在UIWebView,相册,UITableViewCell删除状态等控件不会根据手机当前系统语言来进行设置,二十根据应用内部语言来设置的。 设置方法,直接在工程 Info.plist文件中增加CFBundleLocalizations键的值,zh_CN,en,等。
《iOS进阶》-UIWindow
UIWindow UIWindow是最顶层的界面容器,继承自UIView。作用如下: 作为UIView的最顶层容器,包含应用显示所需要的所有UIView。 传递触摸消息和键盘事件给UIView。 为UIWindow增加UIView 通过addSubView方法。 通过特有的rootViewController属性。通过设置该属性为要添加view对应的UIViewController,UIWindow会自动将其View添加到当前window中,同时负责维护ViewController和view的生命周期。 系统对UIWindow的使用 通常在一个程序中只会有一个UIWindow,但是有时候调用系统控件时(如UIAlertView),iOS系统为了保证控件在所有的界面之上,他会临时创建一个新的UIWindow,通过将其UIWindow的UIWindowLevel设置得更高,让控件盖在所有的应用界面之上。 UIWindow的UIWindowLevel属性定义了UIWindow的层级。一共有三种取值,默认为0: typedef CGFloat UIWindowLevel;...
《iOS进阶》-GCD使用
GCD的使用 block的定义 block 有点像函数指针,只不过用”^”代替了“*“ 申明变量:(void)(^loggerBlock)(void); 定义:loggerBlock = ^{ NSLog(@"Hello World");}; 调用:loggerBlock(); block特点: 程序块可以在代码中以内联的方式来定义。 程序块可以访问在创建它的范围内的可用变量。 系统的dispatch方法 苹果提供了一些方法方便我们将block放在主线程或后台线程执行或咽喉执行。 ...
《iOS进阶》-Core Foundation对象的内存管理
Core Foundation对象的内存管理 底层的Core Foundation对象,大多数以XxxCreateWithXxx的方式创建如:CFStringRef str = CFStringCreateWithCString(kCFAllocatorDefault,"Hello World",kCFStringEncodingUTF8);,对于CFRetain和CFRelease两种方法,与OC中的Retain和Release大致一致。所以在处理底层Core Foundation对象,我们只需要延续以前手工管理引用计数的办法即可。 在ARC下,我们有时需要将一个Core Foundation对象转换成一个OC对象,这时候我们需要告诉编译器,转换过程中引用计数该如何调整,这就引入了bridge相关的关键字。 __bridge:只做类型转换,不修改相关对象的引用计数,原来的Core Foundation对象在不用时,需要调用CFRelease方法。 __bridge_retained:类型转换后,将相关对象的引用计数加1,原来的Core Foundation对象在不用时,需要调用CFRelease方法。 __bridge_transfer:类型转换后,将该对象的引用计数交给ARC管理,Core Foundation对象在不用时,不再需要调用CFRelease方法。