如何在iOS 7上将UIView粘贴到UIWindow的顶部

时间:2014-12-15 14:22:22

标签: ios ios7 uiview ios8 uiwindow

我有一个自定义UIView,即使界面方向发生变化,我仍希望将其固定在UIWindow的顶部。这是我的纵向视图

enter image description here

问题是之前的iOS 8 UIWindow坐标系没有随方向变化而改变。所以我需要手工完成所有的计算。 第一件事是改变UIView的变换,我使用这种方法

 -(CGFloat)angleForOrientation:(UIInterfaceOrientation)orientation
{
    CGFloat angle;
    switch (orientation) {
        case UIInterfaceOrientationLandscapeLeft:
            angle = -M_PI /2.0;
            NSLog(@"UIInterfaceOrientationLandscapeLeft");
            break;

        case UIInterfaceOrientationLandscapeRight:
            angle = M_PI /2.0;
            NSLog(@"UIInterfaceOrientationLandscapeRight");
            break;

        case UIInterfaceOrientationPortraitUpsideDown:
            angle = M_PI;
            NSLog(@"UIInterfaceOrientationPortraitUpsideDown");
            break;

        default:
            angle = 0;
            NSLog(@"UIInterfaceOrientationPortrait");
            break;

    }
    return  angle;
}

第二件事是以某种方式将实际坐标系映射到UIWindow坐标系,它保持不变。 那么我应该如何计算自定义UIView的框架,即使用户将视图旋转到其他方向,我也会将相同大小的UIView粘贴到屏幕的顶部中心? 例如,这是视图在景观中应该是什么样子

enter image description here

顺便说一下这个图像是从iOS 8版本生成的。我为此做了以下

   self.frame =  CGRectMake(window.bounds.size/2-50, 0, 100, 100);
   CGFloat angle = [self angleForOrientation:orientation];
   self.transform = CGAffineTransformMakeRotation(angle);

我需要做类似iOS 7的事情。我怎样才能做到这一点?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

所以最后我想出了如何实现这一点。

我已经创建了以下方法来计算矩形,它会根据给定的边界将视图粘贴到顶部。

-(CGRect)getTopRectForBounds:(CGRect)bounds orientation:(UIInterfaceOrientation)orientation window:(UIWindow *)window
{
    CGRect newRect;
    CGFloat statusBarHeight = [self getStatusBarHeight];
    CGSize screenSize = window.screen.bounds.size;
    CGFloat sW = screenSize.width;
    CGFloat sH = screenSize.height;
    CGFloat W = rect.size.width;
    CGFloat H = rect.size.height;
    switch (orientation) {
        case UIInterfaceOrientationLandscapeLeft:
            newRect = CGRectMake(statusBarHeight, (sH-W)/2, H,W);
            break;
        case UIInterfaceOrientationLandscapeRight:
            newRect =  CGRectMake(sW-H-statusBarHeight, (sH-W)/2, H,W);
            break;
        case UIInterfaceOrientationPortraitUpsideDown:
            newRect =  CGRectMake((sW-W)/2, sH-H-statusBarHeight, W,H);
            break;
        default:
            newRect =  CGRectMake((sW-W)/2, statusBarHeight, W,H);
            break;
    }
    return newRect;
}

然后我只需在方向改变时更改框架。 所以首先我听取方向改变

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameOrOrientationChanged:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameOrOrientationChanged:) name:UIApplicationDidChangeStatusBarFrameNotification object:nil];

然后在方向更改事件处理程序中更改变换和框架。 (请参阅我的问题以查看处理变换的方法)

CGRect bounds = CGRectMake(0, 0, 100, 100);
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
self.frame =  [self getTopRectForBounds:bounds orientation:orientation window:self.window]
CGFloat angle = [self angleForOrientation:orientation];
self.transform = CGAffineTransformMakeRotation(angle);