MinggeQingchun 2012-02-06
在iOS中的屏幕变换,也就是横竖屏的转换,虽然可以直接使用UIViewController的
– willRotateToInterfaceOrientation:duration:
– willAnimateRotationToInterfaceOrientation:duration:
– didRotateFromInterfaceOrientation:
– willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:
– didAnimateFirstHalfOfRotationToInterfaceOrientation:
– willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:
这些函数来响应屏幕旋转时候的事件。之所以相应这些事件当然是为了对视图的显示进行处理,这种写法对于视图的处理并不是十分方便。
还有一种方法就是覆盖UIVIew的
-(void)layoutSubviews方法,在该方法中调整自身的frame的属性,但是苹果文档中也说明了,这个方法是用语对自身的子视图做处理的方法。
上面的两种方法虽然都可以实现在屏幕旋转时候对视图进行处理,但是并不理想。
实际上,我们可以使用通知来实现。当屏幕的方向变化的时候,只要注册通知,就可以正确处理屏幕的变换了。
首先我们要注册通知,
在哪里注册呢?肯定是在需要变换的视图的initWithFrame方法中注册通知了。
例如:- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(changeFrames:)
name:UIDeviceOrientationDidChangeNotification
object:nil];
self.backgroundColor=[UIColor greenColor];
}
return self;
}
之后在写@selector中的函数changeFrames:
如下:
-(void)changeFrames:(NSNotification *)notification
{
NSLog(@"changenotification:%@",notification.userInfo);
floatwidth=[[UIScreenmainScreen]bounds].size.width*[[UIScreenmainScreen]scale];
floatheight=[[UIScreenmainScreen]bounds].size.height*[[UIScreenmainScreen]scale];
if([[UIDevicecurrentDevice]orientation]==UIInterfaceOrientationPortrait
|| [[UIDevice currentDevice] orientation]==UIInterfaceOrientationPortraitUpsideDown){
NSLog(@"portrait");
self.frame=CGRectMake(0,0,height,width);
}else
{
NSLog(@"landscape");
self.frame=CGRectMake(0,0,width,height);
}NSLog(@"view is %@",self);}
上面使用了scale这个函数,是为了使视图的缩放比例是正确的。