屏幕自动旋转和调节大小

1.新建工程名为RotateDemo , File->New->Project ->single View Application -> next

2.在view视图上添加两个Label,

[cpp] view plain copy

  1. //  RotateViewController.h
  2. #import <UIKit/UIKit.h>
  3. @interface RotateViewController : UIViewController
  4. {
  5. UILabel *upLabel;
  6. UILabel *downLabel;
  7. CGRect upFrame;
  8. CGRect dowmFrame;
  9. }
  10. @end

[cpp] view plain copy

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. // Do any additional setup after loading the view, typically from a nib.
  5. upFrame = CGRectMake(10, 10, 300, 100);
  6. dowmFrame = CGRectMake(10, 350, 300, 100);
  7. //    初始化Label
  8. upLabel = [[UILabel alloc] initWithFrame:upFrame];
  9. downLabel = [[UILabel alloc] initWithFrame:dowmFrame];
  10. //    设置标题
  11. [upLabel setText:@"在上面"];
  12. [downLabel setText:@"在下面"];
  13. //    设置字体大小
  14. upLabel.font = [UIFont systemFontOfSize:48.0];
  15. downLabel.font = [UIFont systemFontOfSize:48.0];
  16. //    字体加粗
  17. upLabel.font = [UIFont boldSystemFontOfSize:48];
  18. downLabel.font = [UIFont boldSystemFontOfSize:48];
  19. //    如果label标题很长,可以使用此方法让标题大小自动适合label宽度
  20. /*
  21. upLabel.adjustsFontSizeToFitWidth =YES;
  22. downLabel.adjustsFontSizeToFitWidth = YES;
  23. */
  24. //    设置Label标题居中对其
  25. upLabel.textAlignment=UITextAlignmentCenter;
  26. downLabel.textAlignment = UITextAlignmentCenter;
  27. //    设置label标题颜色
  28. [upLabel setTextColor:[UIColor blackColor]];
  29. [downLabel setTextColor:[UIColor blueColor]];
  30. //    设置Label透明度0是完全透明,1是不透明
  31. upLabel.alpha = 0.9;
  32. downLabel.alpha = 0.4;
  33. //    把label添加到视图上
  34. [self.view addSubview:upLabel];
  35. [self.view addSubview:downLabel];
  36. }

?「Command 键」+ ->  可以切换视图旋转方向,或者菜单栏点击硬件,在下拉菜单里有旋转方向控制选项,运行结果截图
 

出现这情况是iphone根据重力感应所产生的,view视图发生改变,但是两个label坐标并未改变,所以在下面那个label并未显示出来,还有个 就是当Home方向向上的时候,和第二中情况一样了,label坐标发生变化了,这是针对iphone的特殊情况,当有电话呼入的时候,如果Home键在 上,那么我们的话筒和听筒就反了,主要调用的是这个实例方法

[cpp] view plain copy

  1. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
  2. {
  3. return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
  4. }

他的意思就是不支持Home键在上方,如果是ipad我们只需return YES;意思支持屏幕任何方向的旋转,

ios设置了四个方向变量

[cpp] view plain copy

  1. UIInterfaceOrientationPortrait//正常情况下的竖屏
  2. UIInterfaceOrientationPortraitUpsideDown//Home键在上
  3. UIInterfaceOrientationLandscapeLeft//Home键在左
  4. UIInterfaceOrientationLandscapeRight//Home键在右

3.重写willAnimateRotationToInterfaceOrientation方法,重新设置控件的大小与位置

[cpp] view plain copy

  1. - (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
  2. {
  3. if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) {
  4. upLabel.frame = upFrame;
  5. downLabel.frame = dowmFrame;
  6. }
  7. else {
  8. upLabel.frame = CGRectMake(90, 10, 300, 100);
  9. downLabel.frame = CGRectMake(90, 190, 300, 100);
  10. }
  11. }

当屏幕出现旋转开始并在动画发生之前自动调用此方法,首先if判断屏幕方向是竖着(UIInterfaceOrientationIsPortrait)的还是横着(UIInterfaceOrientationIsLandscape),toInterfaceOrientation是传入参数,从变量命名意思我们就可以看出是界面方向,此方法是对label进行屏幕不同方向的重新布局,

处理屏幕旋转问题的函数还有几个,他们之间有的放在一起会相互制约,而且在模拟器下只有

[cpp] view plain copy

  1. willAnimateRotationToInterfaceOrientation    <span style="color: rgb(51, 51, 51); font-family: Arial; line-height: 26px; text-align: left; text-indent: 28px;font-size:16px; ">willRotateToInterfaceOrientation     <span style="color: rgb(51, 51, 51); font-family: Arial; line-height: 26px; text-align: left; text-indent: 28px;font-size:16px; ">didRotateFromInterfaceOrientation</span></span>

三个方法可以使用,其他的只能在真机上使用:此处参考的是http://blog.csdn.net/sjzsp/article/details/6364585

//在视图旋转动画前一半发生之前自动调用
-(void)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

{

}

//在视图旋转动画后一半发生之前自动调用
-(void)willAnimateSecondHalfOfRotationFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation duration:(NSTimeInterval)duration

{

}

//该方法将在视图旋转之前自动调用

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

{

}

//该方法在试图旋转完成之后调用
-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation

{

}

//在试图旋转动画前一半发生之前自动调用
-(void)didAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation

{

}

4.若在在视图中添加一张背景图片,图片会不会自动旋转调节大小呢,拖动一张background.png图片到工程中,在ViewDidLoad上添加一下代码,并运行下结果:

[cpp] view plain copy

  1. UIImage *image = [UIImage imageNamed:@"background.png"];
  2. //用图片初始化一张视图
  3. UIImageView *backgroundView = [[UIImageView alloc] initWithImage:image];
  4. //更改视图视图属性,设置为YES
  5. backgroundView.userInteractionEnabled=YES;
  6. //添加至主视图,两个方法实现功能一样
  7. [self setView:backgroundView];
  8. //   [self.view addSubview:backgroundView];

从中我们可以看出,图片是可以根据视图自动调节大小的,但是我想提的一点[self.view addSubview:backgroundView];测试用的是[self setView:backgroundView];他们功能是一样的,不要放在两个[self.View addSubView:upLabel];h和[self.view addSubView:downLabel]后面,否则就会把两个Label给覆盖了,两个label是在backgroundView上没的;

5.对于比较复杂的界面上一种方法就不是那么好控制,如何去实现视图的横向和纵向视图的分离呢,分别设计视图横向模式和纵向模式,然后在实现他们之间的切换操作,代码如下

[cpp] view plain copy

  1. //  RotateViewController.h
  2. #import <UIKit/UIKit.h>
  3. //宏定义,把度数转化成弧度
  4. #define degreesToRadians(x) (M_PI * (x) / 180.0)
  5. @interface RotateViewController : UIViewController
  6. {
  7. UILabel *upLabel;
  8. UILabel *downLabel;
  9. CGRect upFrame;
  10. CGRect dowmFrame;
  11. UIImageView *backgroundView;
  12. UIView *landscape;
  13. UIView *portrait;
  14. }
  15. @end

viewDidLoad方法

[cpp] view plain copy

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. portrait = [[UIView alloc] initWithFrame:self.view.frame];
  5. landscape = [[UIView alloc]initWithFrame:CGRectMake(0, 0,480, 30)];
  6. UIImage *image = [UIImage imageNamed:@"background.png"];
  7. //用图片初始化一张视图
  8. backgroundView = [[UIImageView alloc] initWithImage:image];
  9. //更改视图视图属性,设置为YES
  10. backgroundView.userInteractionEnabled=YES;
  11. upFrame = CGRectMake(10, 10, 300, 100);
  12. dowmFrame = CGRectMake(10, 350, 300, 100);
  13. //    初始化Label
  14. upLabel = [[UILabel alloc] initWithFrame:upFrame];
  15. downLabel = [[UILabel alloc] initWithFrame:dowmFrame];
  16. //    设置标题
  17. [upLabel setText:@"在上面"];
  18. [downLabel setText:@"在下面"];
  19. //    设置字体大小
  20. upLabel.font = [UIFont systemFontOfSize:48.0];
  21. downLabel.font = [UIFont systemFontOfSize:48.0];
  22. //    字体加粗
  23. upLabel.font = [UIFont boldSystemFontOfSize:48];
  24. downLabel.font = [UIFont boldSystemFontOfSize:48];
  25. //    如果label标题很长,可以使用此方法让标题大小自动适合label宽度
  26. //    upLabel.adjustsFontSizeToFitWidth =YES;
  27. //    downLabel.adjustsFontSizeToFitWidth = YES;
  28. //    设置Label标题居中对其
  29. upLabel.textAlignment=UITextAlignmentCenter;
  30. downLabel.textAlignment = UITextAlignmentCenter;
  31. //    设置label标题颜色
  32. [upLabel setTextColor:[UIColor blackColor]];
  33. [downLabel setTextColor:[UIColor blueColor]];
  34. //    设置Label透明度0是完全透明,1是不透明
  35. upLabel.alpha = 0.9;
  36. downLabel.alpha = 0.4;
  37. //    把label添加到视图上
  38. [self.view addSubview:backgroundView];
  39. [self.view addSubview:upLabel];
  40. [self.view addSubview:downLabel];
  41. }

为了支持任何方向的旋转,shouldAutorotateToInterfaceOrientation,方法的返回值设置成return YES; 然后继续重写willAnimateRotationToInterfaceOrientation方法

[cpp] view plain copy

  1. - (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
  2. {
  3. /*****************************************
  4. if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) {
  5. upLabel.frame = upFrame;
  6. downLabel.frame = dowmFrame;
  7. }
  8. else {
  9. upLabel.frame = CGRectMake(90, 10, 300, 100);
  10. downLabel.frame = CGRectMake(90, 190, 300, 100);
  11. }
  12. *****************************************/
  13. if (toInterfaceOrientation == UIInterfaceOrientationPortrait) {
  14. self.view = portrait;
  15. upLabel.frame = upFrame;
  16. downLabel.frame = dowmFrame;
  17. [self setView:backgroundView];
  18. [self.view addSubview:upLabel];
  19. [self.view addSubview:downLabel];
  20. self.view.transform = CGAffineTransformIdentity;
  21. self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(0));
  22. self.view.bounds = CGRectMake(0, 0, 320, 460);
  23. NSLog(@"----------->down");
  24. }
  25. else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) {
  26. self.view = landscape;
  27. upLabel.frame = CGRectMake(90, 10, 300, 100);
  28. downLabel.frame = CGRectMake(90, 190, 300, 100);
  29. [self setView:backgroundView];
  30. [self.view addSubview:upLabel];
  31. [self.view addSubview:downLabel];
  32. //        需要修改transfom属性,此处是回复默认状态,每次变换前都要置位,不然你变换用的坐标系统不是屏幕坐标系统(即绝对坐标系统),而是上一次变换后的坐标系统
  33. self.view.transform = CGAffineTransformIdentity;
  34. //        获取旋转弧度数
  35. self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(-90));
  36. self.view.bounds = CGRectMake(0, 0, 480, 300);
  37. NSLog(@"----------->Left");
  38. }
  39. else if (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
  40. self.view = portrait;
  41. upLabel.frame = upFrame;
  42. downLabel.frame = dowmFrame;
  43. [self setView:backgroundView];
  44. [self.view addSubview:upLabel];
  45. [self.view addSubview:downLabel];
  46. self.view.transform = CGAffineTransformIdentity;
  47. self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(180));
  48. self.view.bounds = CGRectMake(0, 0,320 , 460);
  49. NSLog(@"----------->up");
  50. }
  51. else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) {
  52. self.view = landscape;
  53. upLabel.frame = CGRectMake(90, 10, 300, 100);
  54. downLabel.frame = CGRectMake(90, 190, 300, 100);
  55. [self setView:backgroundView];
  56. [self.view addSubview:upLabel];
  57. [self.view addSubview:downLabel];
  58. self.view.transform = CGAffineTransformIdentity;
  59. self.view.transform  = CGAffineTransformMakeRotation(degreesToRadians(90));
  60. self.view.bounds = CGRectMake(0, 0, 480, 300);
  61. NSLog(@"----------->right");
  62. }
  63. }

self.view.transform = CGAffineTransformIdentity;

self.view.transform = CGAffineTransformMakeRotation(degreesToRadians(-90));

两次修改transform,原因是第一次需要修改transfom属性此处是回复默认状态,每次变换前都要置位,不然你变换用的坐标系统不是屏幕坐标系统(即绝对坐标系统),而是上一次变换后的坐标系统  ,第二次是设置旋转的弧度数,本人再次犯了一个很大低级错误,纠结了两个多小时,和书上一样的代码为什么在Home在上方和Home在下方是屏幕旋转方向不对,这两个方向上视图总是斜着的,郁闷死了,最后才发现是因为CGAffineTransformMakeRotation传参的时候,直接把角度数180和90传进去了,未作弧度装换,你可不要还这样低级错误哦;

最后再把运行截图贴上

6.还可以使用IB工具,使用Size Inpector实现自动旋转 也可以实现屏幕旋转和大小调节,需要使用控件,在此就不做测试, 附上源代码:http://download.csdn.net/detail/duxinfeng2010/4404812

时间: 11-20

屏幕自动旋转和调节大小的相关文章

设置Windows 8.1屏幕自动旋转代码, Auto-rotate function code

程序代码实现启用或禁用Windows 8.1 Tablet的自动旋转功能 方法一:使用SetDisplayAutoRotationPreferences函数功能 #include <Windows.h> /* typedef enum ORIENTATION_PREFERENCE { ORIENTATION_PREFERENCE_NONE = 0x0, ORIENTATION_PREFERENCE_LANDSCAPE = 0x1, ORIENTATION_PREFERENCE_PORTRAIT

iOS系统自带的 **UIAlertView** 以及 屏幕自动旋转的实现

iOS系统自带的 UIAlertView 自动旋转的实现 这里主要解析 UIAlertView 的几个关键功能的实现: 随着设备屏幕的旋转而旋转: Alert弹出框,使用UIWindow来实现,就是说,不用依赖于当前显示在最前面的UIView. 实现源码参考: http://git.oschina.net/shede333/BMAlertHud 使用UIWindow 弹出一个Alert框,最好新建一个 UIWIndow, 把window.windowLevel = UIWindowLevelAl

自动旋转屏幕默认旋转

如下图所示,在处理屏幕默认旋转方向的时候可以在这里进行选择,上下左右一共是4个方向. 策划的需求是游戏采用横屏,但是要求支持两个方向自动旋转,如下图所示,我的设置是这样的.Default Orientation* Auto Roation 表示游戏支持自动旋转屏幕,但是前提是手机没有锁定屏幕旋转功能.Landscape Right 和Landscape Left 表示手机屏幕只支持横屏两个方向的自动旋转. <ignore_js_op> 这里问题就来了,既然设置了两个方向的自动旋转,那么必然会有

IOS某个ViewController禁止自动旋转

IOS屏幕自动旋转,强制横竖屏方法: - (BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientations { return (UIInterfaceOrientationMaskAll);// 修改这里 控制显示方向 } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrienta

IOS6屏幕旋转详解(自动旋转、手动旋转、兼容IOS6之前系统)

IOS6屏幕旋转详解(自动旋转.手动旋转.兼容IOS6之前系统) 转自:http://blog.csdn.net/cococoolwhj/article/details/8208991 概述: 在iOS6之前的版本中,通常使用 shouldAutorotateToInterfaceOrientation 来单独控制某个UIViewController的方向,需要哪个viewController支持旋转,只需要重写shouldAutorotateToInterfaceOrientation方法.

根据系统是否支持自动旋转设置屏幕方向

@Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); boolean autoRotateOn = (android.provider.Settings.System.getInt(getContentResolver(),Settings.System.ACCELEROMETER_ROTATION, 0) == 1) ; if(autoRotateOn){ Log.i

iOS_book03 -自动旋转、自动调整大小、尺寸分类器

自动旋转(autorotation):支持在纵向模式(长而窄)或横向模式(短而宽)下使用应用程序,支持在旋转设备时更改应用程序的方向. 苹果公司建议iPad上的大部分应用程序都应该支持所有的方向. 对于iPhone应用,基本原则是:如果自动旋转能够增强用户体验,就应该将它们添加到应用中.对于iPad应用,添加自动旋转功能是一项铁则. 注意:如果应用程序显示了状态栏,则垂直屏幕上程序实际可用的空间将在垂直方向上减少20点.状态栏位于屏幕顶部,高度为20点,用于显示信号强度.时间以及电池电量等信息.

第05章 自动旋转和自动调整大小

自动旋转机制: 并不是所有的iphone都需要支持所有方向.不过apple建议,所有的ipad app都支持所有方向. iphone4为 320*480 iphone5 用点为单位的话,大小为 320*568,Retina屏幕一个点为4个像素 ipad为 768*1024个点 所有的状态栏(顶部显示信号强度,时间,电量等)为20个点 自动旋转的实现方式: 1.为控件定义约束,使得在不同的视图内,控制自己的位置 2.视图调整时,在代码中手动调整视图内对象的位置 3.在IB中,为视图设计两个不同的版

iOS中的屏幕的旋转(UIViewController)横屏竖屏

RootViewController //视图控制器(UIViewController):它不是视图,用来管理视图,所以屏幕上看不到,但是自身携带一个视图(根视图) #import "RootViewController.h" #import "LoginView.h" //视图控制器的延展 @interface RootViewController () @end //视图控制器的实现部分 @implementation RootViewController //