2014-09-21 4 views
3

До iOS7, если бы я хотел создать своего рода фиксированный «фон», который бы не вращался, не анимировал или не масштабировался, я бы просто привязал UIView к основному UIWindow , Это был своего рода хак ... но он отлично служил своей цели.Сохранять UIView при подключении к UIWindow в iOS8

В iOS8 они изменили способ поведения UIWindow между прочим (например, теперь [UIScreen mainScreen].bounds возвращает разные размеры в зависимости от ориентации).

Во всяком случае ...

Мой вопрос: как я могу получить iOS8 вести себя как iOS7 и ниже? Я уже пытался создать два ViewControllers, один с shouldAutorotate методом, установленным на NO, но без везения.

желаемый эффект, показанный здесь:

enter image description hereenter image description here

Есть идеи?

+0

Вы уже установили supportInterfaceOrientations? Созданы ли ваши VC кодом или IB? Вы также хотите убедиться, что shouldAutorotate попадает в ваш код контроллера с точкой останова. – Ben

+0

Да ... Я уже установил supportedInterfaceOrientations (и фактически один из VC вращается правильно, иначе это не будет). VC создаются с помощью кода, и toAutorotate получает удар, но не соблюдается. До iOS 8 вы также можете получить желаемый эффект с помощью одного VC, добавив вид, который вы хотите сохранить фиксированным, к основному uiwindow. – Andrea

ответ

0

Если вы создаете приложение с помощью SDK iOS8, вы можете использовать nativeBounds, который всегда будет возвращать границы для портретной ориентации, но в пикселях, а не в точках.

Чтобы получить право в точках, вы должны разделить их на nativeScale.

if ([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)]) { 
    CGFloat scaleFactor = 1.0f/[self nativeScale]; 
    CGRect realBounds = CGRectApplyAffineTransform([self nativeBounds], 
                CGAffineTransformMakeScale(scaleFactor, scaleFactor)); 
} 

Так что я думаю, что вы можете подписаться на уведомление didChangeStatusBarOrientation и в методе расчета новый кадр на зеленый квадрат и обосновывать вращение:

rect.transform = CGAffineTransformMakeRotation((CGFloat)M_PI * (90.f)/180.0f); 

для пейзажа правой ориентации

+0

Спасибо за ваш вклад. Однако то, что я пытаюсь достичь, - это полностью фиксировать представление ... это другой подход: мне не нужно его «вращаться», мне нужно, чтобы он оставался там, где он есть, не подвержен влиянию вращения устройства (в то время как все остальное). – Andrea

0

попытаться использовать этот подкласс с фиксированным вращением:

@interface RotationView : UIView { 
    struct { 
    CGPoint portOrigin; 
    CGPoint leftOrigin; 
    CGPoint rightOrigin; 
    CGPoint upsideOrigin; 
    } origins; 

    struct { 
    NSInteger portDegree; 
    NSInteger leftDegree; 
    NSInteger rightDegree; 
    NSInteger upsideDegree; 
    } degrees; 
} 

@end 

@implementation RotationView 

- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange:) 
               name:UIDeviceOrientationDidChangeNotification object:nil]; 
    } 

    return self; 
} 

- (void)didMoveToSuperview { 
    [super didMoveToSuperview]; 

    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; 
    if (orientation == UIInterfaceOrientationPortrait) { 
    origins.portOrigin = self.frame.origin; 
    origins.rightOrigin = CGPointMake(CGRectGetMinY(self.frame), CGRectGetWidth(self.superview.frame) - CGRectGetMinX(self.frame) - CGRectGetWidth(self.frame)); 
    origins.leftOrigin = CGPointMake(CGRectGetHeight(self.superview.frame) - CGRectGetMinY(self.frame) - CGRectGetHeight(self.frame), CGRectGetMinX(self.frame)); 
    origins.upsideOrigin = CGPointMake(CGRectGetWidth(self.superview.frame) - CGRectGetMinX(self.frame) - CGRectGetWidth(self.frame), 
             CGRectGetHeight(self.superview.frame) - CGRectGetMinY(self.frame) - CGRectGetHeight(self.frame)); 

    degrees.portDegree = 0.0F; 
    degrees.rightDegree = 270; 
    degrees.leftDegree = 90.0F; 
    degrees.upsideDegree = 180.0F; 

    } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) { 
    origins.portOrigin = CGPointMake(CGRectGetWidth(self.superview.frame) - CGRectGetMinX(self.frame) - CGRectGetWidth(self.frame), 
            CGRectGetHeight(self.superview.frame) - CGRectGetMinY(self.frame) - CGRectGetHeight(self.frame)); 
    origins.leftOrigin = CGPointMake(CGRectGetMinY(self.frame), CGRectGetWidth(self.superview.frame) - CGRectGetMinX(self.frame) - CGRectGetWidth(self.frame)); 
    origins.rightOrigin = CGPointMake(CGRectGetHeight(self.superview.frame) - CGRectGetMinY(self.frame) - CGRectGetHeight(self.frame), CGRectGetMinX(self.frame)); 
    origins.upsideOrigin = self.frame.origin; 

    degrees.portDegree = 180.0F; 
    degrees.rightDegree = 90.0F; 
    degrees.leftDegree = 270; 
    degrees.upsideDegree = 0.0F; 

    } else if (orientation == UIInterfaceOrientationLandscapeLeft) { 
    origins.upsideOrigin = CGPointMake(CGRectGetHeight(self.superview.frame) - CGRectGetMinY(self.frame) - CGRectGetHeight(self.frame), CGRectGetMinX(self.frame)); 
    origins.leftOrigin = self.frame.origin; 
    origins.rightOrigin = CGPointMake(CGRectGetWidth(self.superview.frame) - CGRectGetMinX(self.frame) - CGRectGetWidth(self.frame), 
             CGRectGetHeight(self.superview.frame) - CGRectGetMinY(self.frame) - CGRectGetHeight(self.frame)); 
    origins.portOrigin = CGPointMake(CGRectGetMinY(self.frame), CGRectGetWidth(self.superview.frame) - CGRectGetMinX(self.frame) - CGRectGetWidth(self.frame)); 

    degrees.upsideDegree = 90.0F; 
    degrees.leftDegree = 0.0F; 
    degrees.rightDegree = 180.0F; 
    degrees.portDegree = 270.0; 

    } else if (orientation == UIInterfaceOrientationLandscapeRight) { 
    origins.portOrigin = CGPointMake(CGRectGetHeight(self.superview.frame) - CGRectGetMinY(self.frame) - CGRectGetHeight(self.frame), CGRectGetMinX(self.frame)); 
    origins.leftOrigin = CGPointMake(CGRectGetWidth(self.superview.frame) - CGRectGetMinX(self.frame) - CGRectGetWidth(self.frame), 
            CGRectGetHeight(self.superview.frame) - CGRectGetMinY(self.frame) - CGRectGetHeight(self.frame)); 
    origins.rightOrigin = self.frame.origin; 
    origins.upsideOrigin = CGPointMake(CGRectGetMinY(self.frame), CGRectGetWidth(self.superview.frame) - CGRectGetMinX(self.frame) - CGRectGetWidth(self.frame)); 

    degrees.portDegree = 90.0F; 
    degrees.leftDegree = 180.0F; 
    degrees.rightDegree = 0.0F; 
    degrees.upsideDegree = 270.0F; 
    } 
} 

#pragma mark Manual oritentation change 

#define RADIANS(degrees) ((degrees * (float)M_PI)/180.0f) 

- (void)deviceOrientationDidChange:(NSNotification *)notification { 
    if (!self.superview) { 
    return; 
    } 

    if ([self.superview isKindOfClass:[UIWindow class]]) { 
    [self setTransformForCurrentOrientation]; 
    } 
} 

- (void)setTransformForCurrentOrientation { 
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; 

    if (UIInterfaceOrientationIsLandscape(orientation)) { 
    if (orientation == UIInterfaceOrientationLandscapeLeft) { 
     [self setTransform:CGAffineTransformMakeRotation(RADIANS(degrees.leftDegree))]; 
     [self setOrigin:origins.leftOrigin]; 
    } else { 
     [self setTransform:CGAffineTransformMakeRotation(RADIANS(degrees.rightDegree))]; 
     [self setOrigin:origins.rightOrigin]; 
    } 
    } else { 
    if (orientation == UIInterfaceOrientationPortraitUpsideDown) { 
     [self setTransform:CGAffineTransformMakeRotation(RADIANS(degrees.upsideDegree))]; 
     [self setOrigin:origins.upsideOrigin]; 
    } else { 
     [self setTransform:CGAffineTransformMakeRotation(RADIANS(degrees.portDegree))]; 
     [self setOrigin:origins.portOrigin]; 
    } 
    } 
} 

@end 

setOrigin - это метод категории:

- (void)setX:(CGFloat)x { 
    CGRect frame = self.frame; 
    frame.origin.x = x; 
    self.frame = frame; 
} 

- (void)setY:(CGFloat)y { 
    CGRect frame = self.frame; 
    frame.origin.y = y; 
    self.frame = frame; 
} 
- (void)setOrigin:(CGPoint)origin { 
    [self setX:origin.x]; 
    [self setY:origin.y]; 
}