设备屏幕旋转后,监控View的方向

Posted by Onery on November 6, 2014

#以UIButton为例子 #1.首先创建一个Button

	 UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
	  btn.backgroundColor = [UIColor clearColor];
	    btn.frame = CGRectMake(100, 100, 40, 40);
	    [btn addTarget:self action:@selector(test) forControlEvents:UIControlEventTouchUpInside];
	    [btn setBackgroundImage:[UIImage imageNamed:@"image"] forState:UIControlStateNormal];
	    [self.view addSubview:btn];

#2.需要一个集合

	//添加属性
	@property (nonatomic, strong) NSMutableSet *btnSet;
	//初始化
    _btnSet = [[NSMutableSet alloc]init];
    //添加元素
    [_btnSet addObject:btn];

#3.监听设备方向

	//在VieDidLoad中添加
	[[NSNotificationCenter defaultCenter] removeObserver:self name:@"kNotificationOrientationChange" object:nil];
	    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationDidChange:) name:@"kNotificationOrientationChange" object:nil];
	    
    //接着实现这些方法
    #pragma mark ---------rotate(only when this controller is presented, the code below effect)-------------
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
	  [[NSNotificationCenter defaultCenter] postNotificationName:@"kNotificationOrientationChange" object:nil];
	    return (interfaceOrientation == UIInterfaceOrientationPortrait);
	}
	#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_6_0
	//iOS6+
- (BOOL)shouldAutorotate{
	  [[NSNotificationCenter defaultCenter] postNotificationName:@"kNotificationOrientationChange" object:nil];
	    return NO;
	}
- (NSUInteger)supportedInterfaceOrientations
	{
	    return UIInterfaceOrientationMaskAll;
	}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
	{
	    //    return [UIApplication sharedApplication].statusBarOrientation;
	    return UIInterfaceOrientationPortrait;
	}
	#endif

#4.实现监听方法

-(void)orientationDidChange:(NSNotification *)noti{
	    if (!_btnSet || _btnSet.count <= 0) {
	        return;
	    }
	    [_btnSet enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
	        UIButton *btn = ([obj isKindOfClass:[UIButton class]] ? (UIButton*)obj : nil);
	        if (!btn) {
	            *stop = YES;
	            return ;
	        }
        btn.layer.anchorPoint = CGPointMake(0.5, 0.5);
        CGAffineTransform transform = CGAffineTransformMakeRotation(0);
        switch ([UIDevice currentDevice].orientation) {
            case UIDeviceOrientationPortrait://1
            {
                transform = CGAffineTransformMakeRotation(0);
                break;
            }
            case UIDeviceOrientationPortraitUpsideDown://2
            {
                transform = CGAffineTransformMakeRotation(M_PI);
                break;
            }
            case UIDeviceOrientationLandscapeLeft://3
            {
                transform = CGAffineTransformMakeRotation(M_PI_2);
                break;
            }
            case UIDeviceOrientationLandscapeRight://4
            {
                transform = CGAffineTransformMakeRotation(-M_PI_2);
                break;
            }
            default:
                break;
        }
        [UIView animateWithDuration:0.3f animations:^{
            btn.transform = transform;
        }];
	    }];
		}

###接着就运行吧~~~

是否发现怎么转屏幕button的方向都没变,仔细读代码

   #pragma mark ---------rotate(only when this controller is presented, the code below effect)-------------

相信你已经明白问题所在了~