转载请注明出处
http://blog.csdn.net/pony_maggie/article/details/27706991
作者:小马
由于第五课的内容比较多,分两部分来写。
一 屏幕旋转基本操作
控制当前的view是否支持旋转,如果是,是支持哪些方向的,有四个方向,分别是home键在下,上,左右.
在当前的viewcontroller里,实现shouldAutorotateToInterfaceOrientation方法,告诉系统你支持的旋转方向,如下:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return YES; //四个方向都支持 //return UIInterfaceOrientationIsPortrait(interfaceOrientation); //只支持直立 //return (interfaceOrientation==UIInterfaceOrientationLandscapeLeft) //横向Home键在左 //return (interfaceOrientation== UIInterfaceOrientationLandscapeRight) //横向Home键在右 //return (interfaceOrientation== UIInterfaceOrientationPortrait) //竖向正常 //return (interfaceOrientation==UIInterfaceOrientationLandscapeLeft) //竖向Home键在上 }
如果没有实现这个方法,默认是不支持旋转,只有portrait。
不过IOS6以后,这个方法被列为DEPRECATED 方法了,不能再用了. 用两个新的方法代替.
(注意,为了向后兼容iOS 4 and 5,还是需要在你的app里保留shouldAutorotateToInterfaceOrientation)
supportedInterfaceOrientations 和shouldAutorotate
如果是不能旋转,只需要
- (BOOL)shouldAutorotate { return NO; }
比如要支持横向
-(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskAllButUpsideDown; } - (BOOL)shouldAutorotate { return YES; }
同时,还需要在Info.plist文件里面添加程序支持的方向。如果没有实现上述两个方法,iphone默认是仅支持横向旋转。
二Struts and springs
这是一个老的布局模型,xcode4.5之后默认都是用Autolayout,所以不会看到下面这样的Struts and springs,如下图:
如果想用这个,在工程里把useAutolayout的box勾选掉。Struts and springs可以设置当一个视图的父视图大小改变时,其自身需要做出什么改变。比如从纵向变成横向时,可能有必要对一些控件做一些拉伸等。注意看上图左别边部分,分为两部分,外层是一些像大写字母I一样的东西,这些控制当父视图改变时,子视图应该怎么”靠”,里层的像箭头一样的控制当父视图改变时,子视图应该怎么“拉伸”。当然Struts and springs并不是万能的,它只能处理一些简单的情况。有一些场景还是需要用代码来完成的。设想一下如果一个计算器的应用,从纵向变成横向,可不是简单拉伸一些按钮就行的,这种情况就要写代码来做一些布局了。
由于篇幅有限,这里就不详细举例子了,推荐一篇关于自动布局比较好的文章:
http://www.cocoachina.com/applenews/devnews/2013/1203/7462.html
三 协议
这节课有10分钟左右的时间讲了一下协议,因为我之前的文章对这个已经有描述,这里就不做过多介绍了。
四 手势识别
手势识别的核心是UIGestureRecognizer类,通过两个步骤就可以添加一个手势识别的功能,一是在UIView里加入gesture,二是实现一个处理函数,这些在下一部分的示例代码中都会看得到。
需要注意的是,第一步通常是在controller完成,第二个是在UIView里做。这种思想源于对UIView的复用性考虑,也就是我们要考虑一个UIView会被多个controller使用,可能不用的controller会有不同的手势识别需求。
这里给了一个添加手势识别的示例,这段代码当然是最好放在controller实现部分。这里面的pan函数就是上面提到的处理函数,也就是当某个手势触发时要执行的动作。
上面给出了UIGestureRecognizer(或者其子类)提供的方法和属性,这些方法和属性协助我们实现处理函数,因为处理函数有一个默认的参数就是UIGestureRecognizer(或者其子类)的实际,比如这样的代码:
//手势识别,缩放功能 - (void)pinch:(UIPinchGestureRecognizer *)gesture { if ((gesture.state == UIGestureRecognizerStateChanged) || (gesture.state == UIGestureRecognizerStateEnded)) { /* 下面两行代码其实和这一行效果是一样的,所以注意理解第二行置1的作用.可以查一下gesture.scale是怎么取值的 self.scale = gesture.scale; */ self.scale *= gesture.scale; NSLog(@"scale:%f", gesture.scale); gesture.scale = 1; } }
然后我们看到这里给出三个具体的UIGestureRecognizer的子类,分别用于处理缩放,翻转以及滑动的手势。
第二部分我们会讲到代码示例。