屏幕旋转

视图控制器,本身可以检测到屏幕是否有在旋转,如果有屏幕旋转这个事件,处理这个旋转,需要重写一下几个方法即可。

 

- (NSUInteger)supportedInterfaceOrientations

这个方法是用来设置设备支持旋转的方向(这里说的旋转方式不是手机的旋转方向,而是屏幕里屏幕的旋转方向,因为屏幕内容与手机旋转方向是相反的)

// 设备支持旋转方向

- (NSUInteger)supportedInterfaceOrientations{

    return UIInterfaceOrientationMaskAll;

}

return回去的,是屏幕内容的旋转方向。

willRotateToInterfaceOrientation:duration:

将要旋转前要作的事,目前苹果已经弃用

didRotateFromInterfaceOrientation:

完成旋转后要做的事,目前苹果已经弃用。

当检测到旋转后,应重启另一套布局,用来适应屏幕的宽高等。重要标志是bounds的值是否改变。如果改变,则会调用一个方法layoutSubviews。

在这个方法里,可以对布局进行修改

RootViewController.m

视图控制器,检测到屏幕是否有旋转,如果旋转,则进行对应的处理。

这里的旋转可以旋转几个方向,可以设置某些方向的旋转无效。return响应的方向即可

#import "RootViewController.h"

#import "MyView.h"

@interface RootViewController ()

 

@property(nonatomic,retain)MyView *mv;

 

@end

 

@implementation RootViewController

 

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

    NSLog(@"将要旋转..");

}

 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{

    NSLog(@"旋转完成..");

}

 

// 设备支持旋转方向

- (NSUInteger)supportedInterfaceOrientations{

    return UIInterfaceOrientationMaskAll;

}

- (void)loadView{

    self.mv = [[[MyView alloc]initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

    self.view = _mv;

}

- (void)dealloc

{

    [_mv release];

    [super dealloc];

}

- (void)viewDidLoad {

    [super viewDidLoad];

}

// 接收到内存警告

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // 根视图已经加载过并且根视图没有显示在屏幕上

    if([self isViewLoaded]== YES && self.view.window == nil){

        // 将根视图销毁

        self.view = nil;

    }

}

@end

MyView.m

 

#import "MyView.h"

 

@interface MyView ()

 

@property(nonatomic,retain)UIView *v;

 

@end

@implementation MyView

- (void)dealloc

{

    [_v release];

    [super dealloc];

}

 

- (instancetype)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    if (self) {

        [self p_setupView];

    }

    return self;

}

- (void)p_setupView{

   

    self.backgroundColor = [UIColor greenColor];

    self.v = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 230, 300)];

    self.v.backgroundColor = [UIColor grayColor];

    [self addSubview:_v];

   

}

// 当bounds发生改变的时候,自动调用此方法

-(void)layoutSubviews{

    NSLog(@"bounds 发生改变");

    // 获取当前设备方向

    if (([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait)) {

        self.v.frame = CGRectMake(50, 50, 230, 300);

    }else{

        self.v.frame = CGRectMake(100, 50, 300, 230);

    }

}

@end

旋转后对布局的选择,适应屏幕

posted @ 2015-10-10 11:56  Coder_J  阅读(324)  评论(0编辑  收藏  举报