linux nginx Ubuntu linux命令 Android 程序员 Firefox Windows php mysql 微软 wordpress apache HTML5 开源 google shell java Python centos

IOS开发中经常会用到的常用技巧小技巧以及你不知道的小秘密

群里的每天都有大量的各种各样的莫名其妙的重复的问题,我也耳濡目染了很多新xcoder经常会犯的一些错误,于是今天抽空写下这篇文章,分享我的一些小窍门,也欢迎大家Q我补充。

1.用代码适配iphone5/4   获得设备的Frame:[[UIScreen mainScreen] bounds]

这条代码在新建项目模板的appDelegate中就可以看到,但是很多人都不注意,以至于不知道自己写的APP怎么适配iphone5和4.其实不用去判断设备是否是iphone5,当获得主屏幕的bounds 之后,所有视图的frame 在4和5上的表现区别就在于高度和起始高度(origin.y,height)上面,那么其实用一套代码,以设备的屏幕高度为参照就可以相对的固定好自己的位置和大小了。

例子-让一个80X80的 imageView居中显示:


  1. CGRect myScreen=[[UIScreen mainScreen]bounds];
  2.  
  3. UIImageView *myImageView=[[UIImageView alloc]initwithFrame:CGRectMake(CGRectGetWidth(myScreen)/2-40,CGRectGetHeight(myScreen)/2-40),80,80];
这样能居中的道理很简单: ScreenHeight屏幕高度 同理可见

 另外使用xib也能快速找到参考来适应不同高度的设备,特别是当view的位置是贴近屏幕下边缘的时候:

xib_frame

选中要设置适配的控件,右边的面板点开一个尺子模样的选项卡,然后在Autosizing中把上面的红色实现点一下去掉,然后保留下边,左和右视自己情况,那么就能根据屏幕的下边界来定位我们的控件了,比如这里是356,那么显示出来距离屏幕下边界就会是356 ,而不去理会屏幕有多高。

 2.页面传值:

经常会有人问:视图A中一个按钮点击后打开视图B,视图B做了修改后关闭回到视图A怎么传递视图B所做的修改/怎么让视图A知道视图B已经完成了操作?

页面传值最简单的办法,那么莫过于通过属性了:

视图A中:

#import 视图B

 -(void)某action{

视图B *bView=[[视图B alloc]init];

bView.某属性=@“从视图A过来的值”;

[self.nagvigationController pushViewController:bView animated:yes];
}

视图B中:

@property 某属性;

同理从视图B中把视图A的属性修改,在B中importA。但是由于上面这个方法能bView.某属性,是因为bView这个指针就在action方法内部,所有可以直接用,但是在B视图中A视图已经存在的那个实例的指针怎么拿到?这里绝对不能alloc一个,因为alloc出来那是一个新的A视图,而非弹出B的那个A。

我的做法是再给B加一个属性,叫做 视图A *parent;

在A视图的方法中 bView.parent=self;

通过这一句 ,把调用B的那个A的实例的指针传给了B,那么B知道自己的parent是谁了。再import A,调用parent.某属性=xxxxx就肯定是更改的已存在的那个A的内容。对象在内存中的地址都是给定好的,特别是navigationController中,父视图永远不会比子视图先出栈。所以放心大胆地传吧。

其次,怎么让A视图知道 B视图已经关闭了/释放了/修改了,怎么在不关闭B视图的同时通过B上的控件对A视图进行操作?

首先可以用通知中心,也可以在B中对应的action中调用A中的action。

怎么在B中去调用A中的action呢?

当我们在创建一个UIButton的时候就会设置一个target的delegate,我们一般设置的是self。那么不填self的情况是什么情况,那就是如上例子中,我们的B持有A已存在实例的指针parent。那么我们new一个UIButton ,假设A中有一个action叫做  reloadView:,那么我们的UIButton addTarget的时候,将delegate:参数些微parent,将selecor写为 @selector(reloadView:)  那么当我们点击B视图中的按钮,会执行A视图中的reloadView:方法。

延伸阅读

评论