2014-10-02 47 views
2

我有一个UIViewController,称为OoviumController,它响应设备旋转。 OoviumController是我的应用程序的UIWindow rootViewController。 UIWindow也是它自己的看法。 OoviumController的视图是透明的,并且位于不应该旋转的UIWindow视图的顶部。如何防止自动旋转UIWindow视图

从iOS 2到iOS 7,这一切工作正常。但是,我正在尝试使用iOS 8的XCode 6构建我的项目,并且我注意到现在除了OoviumController的视图之外,UIWindow视图也在旋转,这会在我的应用程序中造成严重问题。

如何将功能返回至以前的工作方式?如何防止UIWindow与我的rootViewController视图一起旋转?

我也注意到,UIWindow文档不再将其列为继承UIView,即使addSubview似乎仍然有效。这是一个文档错误还是UIView的公共继承被弃用?

+0

你知道如何做到这一点吗? – 2015-07-27 17:20:35

+0

@theReverend不幸的是,我没有找到一个简单的方法来做到这一点。然而,我创建了一个蛮力机制来处理这个问题,方法是在顶部创建第二个UIWindow并在旋转过程中将控件翻转到该窗口,然后在旋转完成时向后翻转。我对atm时间有点紧张,但我会尽量在今晚晚些时候回答基础知识。 – aepryus 2015-07-27 18:22:13

+0

@theReverend对不起,我忘记了你。我刚刚发布了几个月前的一些代码。在测试中,我注意到我没有完全完成我正在做的事情,还有一些怪癖。 – aepryus 2015-08-03 22:16:32

回答

0

我还没有找到这个问题的快速,简单或优雅的解决方案。然而,我发现了一个单调乏味的暴力解决方案。我在这个月前工作过,实际上并不认为我完全完成了。但是,我将为感兴趣的任何人发布基本框架工作。

基本概念是创建两个UIWindow对象,一个旋转,另一个不旋转。然后在旋转开始之前将所有控件从旋转窗口翻转到非旋转窗口。旋转完成后将它们翻转回去:

- (void) hideHovers { 
    for (Hover* hover in self.hovers) 
     hover.alpha = 0; 
} 
- (void) showHovers { 
    for (Hover* hover in self.hovers) 
     hover.alpha = 1; 
} 

// Public ========================================================================================== 
- (void) addHover:(Hover*)hover { 
    [[Oovium aetherWindow] addSubview:hover]; 
    [self.hovers addObject:hover]; 
} 

- (void) beforeRotation { 
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; 
    for (Hover* hover in self.hovers) { 
     hover.orientation = orientation; 
     [hover removeFromSuperview]; 
     [controlWindow_ addSubview:hover]; 
    } 
    controlWindow_.hidden = NO; 
    [self showHovers]; 
    [UIView animateWithDuration:0.5 animations:^{ 
     [self hideHovers]; 
    }]; 
} 
- (void) afterRotation { 
    for (Hover* hover in self.hovers) { 
     hover.transform = CGAffineTransformIdentity; 
     [hover removeFromSuperview]; 
     [[Oovium aetherWindow] addSubview:hover]; 
     [hover place]; 
    } 
    controlWindow_.hidden = YES; 
    [UIView animateWithDuration:0.5 animations:^{ 
     [self showHovers]; 
    }]; 
} 

其实,这是很容易的部分。困难的部分是处理控制的转换。下面的代码并不完全适用于所有旋转。我会在完成之后对其进行修改,但我不确定何时能够恢复。

// 
// Hover.m 
// Oovium 
// 
// Created by Joe Charlier on 2/22/15. 
// Copyright (c) 2015 Aepryus Software. All rights reserved. 
// 

#import "Controls.h" 
#import "Hover.h" 
#import "Oovium.h" 
#import "Utility.h" 

@interface Hover() 

@property (nonatomic) OOAnchor anchor; 
@property (nonatomic) CGPoint offset; 
@property (nonatomic) CGSize size; 

@end 

@implementation Hover 

// Static ========================================================================================== 
static CGPoint points_[5][5]; 
static CGPoint shift_[5]; 

+ (void) initialize { 
    CGFloat width = [Utility deviceBounds].size.width; 
    CGFloat height = [Utility deviceBounds].size.height; 

    CGPoint topLeft = CGPointMake(0,0); 
    CGPoint topRight = CGPointMake(width,0); 
    CGPoint bottomLeft = CGPointMake(0,height); 
    CGPoint bottomRight = CGPointMake(width,height); 
    CGPoint center = CGPointMake(width/2,height/2); 

    points_[UIInterfaceOrientationPortrait][OOAnchorTopLeft] = topLeft; 
    points_[UIInterfaceOrientationPortrait][OOAnchorTopRight] = topRight; 
    points_[UIInterfaceOrientationPortrait][OOAnchorBottomLeft] = bottomLeft; 
    points_[UIInterfaceOrientationPortrait][OOAnchorBottomRight] = bottomRight; 
    points_[UIInterfaceOrientationPortrait][OOAnchorCenter] = center; 

    points_[UIInterfaceOrientationLandscapeRight][OOAnchorTopLeft] = topRight; 
    points_[UIInterfaceOrientationLandscapeRight][OOAnchorTopRight] = bottomRight; 
    points_[UIInterfaceOrientationLandscapeRight][OOAnchorBottomLeft] = topLeft; 
    points_[UIInterfaceOrientationLandscapeRight][OOAnchorBottomRight] = bottomLeft; 
    points_[UIInterfaceOrientationLandscapeRight][OOAnchorCenter] = center; 

    points_[UIInterfaceOrientationPortraitUpsideDown][OOAnchorTopLeft] = bottomRight; 
    points_[UIInterfaceOrientationPortraitUpsideDown][OOAnchorTopRight] = bottomLeft; 
    points_[UIInterfaceOrientationPortraitUpsideDown][OOAnchorBottomLeft] = topRight; 
    points_[UIInterfaceOrientationPortraitUpsideDown][OOAnchorBottomRight] = topLeft; 
    points_[UIInterfaceOrientationPortraitUpsideDown][OOAnchorCenter] = center; 

    points_[UIInterfaceOrientationLandscapeLeft][OOAnchorTopLeft] = bottomLeft; 
    points_[UIInterfaceOrientationLandscapeLeft][OOAnchorTopRight] = topLeft; 
    points_[UIInterfaceOrientationLandscapeLeft][OOAnchorBottomLeft] = bottomRight; 
    points_[UIInterfaceOrientationLandscapeLeft][OOAnchorBottomRight] = topRight; 
    points_[UIInterfaceOrientationLandscapeLeft][OOAnchorCenter] = center; 

    shift_[OOAnchorTopLeft] = CGPointMake(0, 0); 
    shift_[OOAnchorTopRight] = CGPointMake(1, 0); 
    shift_[OOAnchorBottomLeft] = CGPointMake(0, 1); 
    shift_[OOAnchorBottomRight] = CGPointMake(1, 1); 
    shift_[OOAnchorCenter] = CGPointMake(0.5, 0.5); 
} 
// ================================================================================================= 

+ (CGRect) placeInRect:(CGRect)rect anchor:(OOAnchor)anchor offset:(CGPoint)offset size:(CGSize)size { 
    CGPoint shift = shift_[anchor]; 
    CGFloat x = shift.x*(rect.size.width-size.width)+offset.x; 
    CGFloat y = shift.y*(rect.size.height-size.height)+offset.y; 
    return CGRectMake(x, y, size.width, size.height); 
} 

- (id) initWithAnchor:(OOAnchor)anchor offset:(CGPoint)offset size:(CGSize)size { 
    if (self = [super initWithFrame:[Hover placeInRect:[UIScreen mainScreen].bounds anchor:anchor offset:offset size:size]]) { 
     self.anchor = anchor; 
     self.offset = offset; 
     self.size = size; 
     self.backgroundColor = [UIColor purpleColor]; 
    } 
    return self; 
} 

- (void) setOrientation:(UIInterfaceOrientation)orientation { 
    _orientation = orientation; 

    CGPoint aO = self.frame.origin; 
    CGPoint aN = points_[orientation][_anchor]; 

    double w = self.size.width; 
    double h = self.size.height; 
    double q = (self.size.height-self.size.width)/2; 
    double ox = self.offset.x; 
    double oy = self.offset.y; 
    double ax = aN.x-aO.x; 
    double ay = aN.y-aO.y; 

    double dx=0; 
    double dy=0; 
    if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) { 
     dx += q; 
     dy += q; 
    } 
    switch (orientation) { 
     case UIInterfaceOrientationPortrait: 
      dx = 0; 
      dy = 0; 
      break; 
     case UIInterfaceOrientationPortraitUpsideDown: 
      switch (_anchor) { 
       case OOAnchorTopLeft: 
        dx += -ax+w+ox; 
        dy += -ay+h+oy; 
        break; 
       case OOAnchorTopRight: 
        dx += -ax+ox; 
        dy += -ay+h+oy; 
        break; 
       case OOAnchorBottomLeft: 
        dx += -ax+w+ox; 
        dy += -ay+oy; 
        break; 
       case OOAnchorBottomRight: 
        dx += -ax+ox; 
        dy += -ay+oy; 
        break; 
      } 
      break; 
     case UIInterfaceOrientationLandscapeRight: 
      switch (_anchor) { 
       case OOAnchorTopLeft: 
        dx += 0; 
        dy += ax-h-ox; 
        break; 
       case OOAnchorTopRight: 
        dx += -ay+w+oy; 
        dy += ax-h+ox; 
        break; 
       case OOAnchorBottomLeft: 
        dx += -ay+oy; 
        dy += 0; 
        break; 
       case OOAnchorBottomRight: 
        dx += -ay+w-oy; 
        dy += ax-ox; 
        break; 
      } 
      break; 
     case UIInterfaceOrientationLandscapeLeft: 
      switch (_anchor) { 
       case OOAnchorTopLeft: 
        dx += ay-h-oy; 
        dy += -w; 
        break; 
       case OOAnchorTopRight: 
        dx += -w; 
        dy += -ax-w-ox; 
        break; 
       case OOAnchorBottomLeft: 
        dx += ay-h+oy; 
        dy += -ay-h; 
        break; 
       case OOAnchorBottomRight: 
        dx += ay-w-oy; 
        dy += -ax+w-ox; 
        break; 
      } 
      break; 
    } 

    CGFloat angle = 0; 
    switch (orientation) { 
     case UIInterfaceOrientationPortrait:   angle = 0;   break; 
     case UIInterfaceOrientationLandscapeRight:  angle = M_PI_2*3; break; 
     case UIInterfaceOrientationPortraitUpsideDown: angle = M_PI;  break; 
     case UIInterfaceOrientationLandscapeLeft:  angle = M_PI_2;  break; 
     case UIInterfaceOrientationUnknown:break; 
    } 

    [self setTransform:CGAffineTransformConcat(
     CGAffineTransformMakeTranslation(dx,dy), 
     CGAffineTransformMakeRotation(angle) 
    )]; 
} 

- (void) invoke { 
    [[Oovium controls] invoke:self]; 
} 

- (void) place { 
    CGSize sz = [UIScreen mainScreen].bounds.size; 
    CGPoint shift = shift_[self.anchor]; 
    CGFloat x = shift.x*(sz.width-self.size.width)+self.offset.x; 
    CGFloat y = shift.y*(sz.height-self.size.height)+self.offset.y; 
    self.frame = CGRectMake(x, y, self.size.width, self.size.height); 
} 

@end