本文主要收集开发中的小技巧,文章主要的形式为列表,逐条归纳总结:
1、搭建一个app的框架的时候,对于tabBarController的一个子视图控制器,经常会设置tabBarItem的title,和navigationController的title,我们往往需要进行两条代码去说明:
viewController.tabBarItem.title = @"Home";
navigationController.title = @"Home";// navigationController是viewController的导航控制器
其实,这两句代码等价于
viewController.title = title;
2、颜色随机操作
viewController.view.backgroundColor = [UIColor colorWithRed:(arc4random()%256)/255.0 green:(arc4random()%256)/255.0 blue:(arc4random()%256)/255.0 alpha:1.0];
arc4random的使用:arc4random()%256表示在[0,256)之间取值,可以取到0,不可以取到256,这恰恰符合RGB颜色取值0到1
3、对于UIButton、UIView等对象尺寸位置方面的属性,除了frame外,其他的属性(size、origin、x、y、width、height)是不能通过赋值进行修改的,所以进行修改的时候必须要先创建一个临时CGRect变量,然后将对象的frame赋值给这个变量,修改这个变量的值后,将这个变量的赋值给对象的frame属性,通过这种方式来修改:
CGRect tempFrame = self.frame;
tempFrame.origin = origin;
self.frame = tempFrame;
如果在程序中有大量的这种代码,那么我们就需要使用一种小技巧,为UIButton或者是UIView等创建一个分类Category,将这种取出又放入的代码放到setter方法中去,然后暴露出orign、size、x、y、width、height这些属性,接着就简化了赋值方式:
button.size = CGSizeMake(10, 10);
4、自定义textField的时候,有时候需要设置左边有个图标,那么会使用到leftView这个属性,但是设置完成后会发现显示不了,那是因为这个属性是一个状态属性,也就是说同时textField提供了leftViewMode这个属性,默认情况下是从不显示的
UIWindow *window = [[UIApplication sharedApplication].windows lastObject];
,需要手动去设置更改
5、调整button中的各种控件的时候,有时候会使用到setTtileEdgeInsets、setImageEdgeInsets等方法,通过名字可以看出,edge是边缘,inset是插入,就是从上下左右去插入一定的距离,那么如果想要使得控件向左移动,就需要在右边插入距离。
6、使用这段代码进行frame的转化
// 由于screen的bounds中的x和y是0,恰好是view中的frame所需要的值
view.frame = [UIScreen mainScreen].bounds;
UIWindow *window = [[UIApplication sharedApplication].windows lastObject];
8、
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
等价于:
UIButton *button = [[UIButton alloc]init];
UITableViewController *tableViewController = [[UITableViewController alloc]init];
NSLog(@"%@",tableViewController.view);
NSLog(@"%@",tableViewController.tableView);
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.size = button.currentImage.size;
// 设定调试模式和发布模式的打印函数-->为了使得发布版本中是没有控制台打印的,从而可以减少消耗
#ifdef DEBUG // 处于调试模式
#define NTLog(...) NSLog(__VA_ARGS__)
#else // 处于发布模式
#define NTLog(...)
#endif
12、对于很多项目,文件分类是非常重要的,这有助于以后后续的开发和调试维护,这里介绍两种比较常见的文件分类模式(对于以tarBarViewController为基础的项目):
(1)MVC ---> 模块
(2)模块----->MVC
这里的模块指的是tarBarViewController的每个控制器(每一个页面模块)
13、重构之同样的代码抽取为一个方法:将整个代码拷贝到方法中,然后将会改变的量设置为方法的参数
14、button的style在iOS7之后是没有明显的效果的,因为iOS7之后苹果的界面进行了大改变,从拟物化变为扁平化,系统中button都是只有文字,而没有边框的
15、在navigationController中通过使用appearence方法来得到一个代表,可以通过代表来设置所有的UIBarButtonItem的样式:
UIBarButtonItem *item = [UIBarButtonItem appearance];
16、在Xcode5之后,图片的拉伸模式可以通过直接对图片设置:
在Assets.xcassets中找到图片,然后查看属性(Attributes),在属性栏的最下面有一个Slicing属性,表示拉伸的时候怎么去操作,里面有四种模式None、Horizontial、Vertical、Horizontial and Vertical 。 选中相对的模式,Xcode自动去寻找合适的值,不需要我们进行修改,到是值得我们注意的一点是,对于不规则的一边,是不应该选择去拉伸的,例如上面是个不规则的箭头,那么就不要去设置Horizontial,否者就会导致形变。选中了相应的模式之后,还需要其中设置一项,是
Center属性,一种是Tiles(平铺),另外一种是Stretches(伸展)
17、在storyboard中,每当调整imageView的时候,我们十分熟悉image在imageView显示的方式,在代码中对应的是ContentView属性
18、对于imageView,如果先创建,再添加image的话,是没有尺寸的:
UIImageView *imageView = [[UIImageView alloc]init];
UIImage *image = [UIImage imageNamed:@"image"];
imageView.image = image;
[self.view addSubview:imageView];
这样是不能够在self.view上显示的
UIImage *image = [UIImage imageNamed:@"image"];
UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
[self.view addSubview:imageView];
但是如果在创建的时候就制定image的话,那么就有尺寸了,这时候在self.view上就可以显示
19、弹出的键盘也是一个window,window在一个 APP中是可以有很多个的,系统的窗口都是全屏的(虽然看上去键盘不是全屏的,但是他实际上是一个全屏的窗口)
20、frame都是相对于父控件的,有时候,父控件所在的坐标系并不是我们希望的坐标系,那么这个时候我们就需要改变坐标系:
(1)通过操作所指控件的frame
[button.superview convertRect:button.frame toView:self.view.window];
[self.view.window convertRect:button.frame fromView:button.superview];
(2)通过操作所指控件的bounds
[button convertRect:button.bounds toView:self.view.window];
[self.view.window convertRect:button.bounds fromView:button];