UIView ändert die Größe nicht, wenn es mit CGAffineTransform unter iOS8 gedreht wird

Ich habe einen UIViewController, der nur einige seiner Unteransichten dreht, wenn das Gerät gedreht wird. Dies funktioniert gut unter iOS7, bricht aber unter iOS8. Es scheint, dass die Grenzen des UIView durch die Transformation unter iOS8 angepasst werden. Das war unerwartet.

Hier ist ein Code:

@interface VVViewController ()
@property (weak, nonatomic) IBOutlet UIView *pinnedControls;
@property (nonatomic, strong) NSMutableArray *pinnedViews;

@end

@implementation VVViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.pinnedViews = [NSMutableArray array];
    [self.pinnedViews addObject:self.pinnedControls];
}

-(void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    [UIViewController rotatePinnedViews:self.pinnedViews forOrientation:self.interfaceOrientation];
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];

    if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation) && UIInterfaceOrientationIsLandscape(self.interfaceOrientation))  {
        [UIViewController rotatePinnedViews:self.pinnedViews forOrientation:toInterfaceOrientation];
    }
}

@end

Wir haben in UIViewController eine Kategorie erstellt, um dieses Verhalten zu behandeln. Hier ist der zugehörige Code:

@implementation UIViewController (VVSupport)

+ (void)rotatePinnedViews:(NSArray *)views forOrientation:(UIInterfaceOrientation)orientation {
    const CGAffineTransform t1 = [UIViewController pinnedViewTansformForOrientation:orientation counter:YES];
    const CGAffineTransform t2 = [UIViewController pinnedViewTansformForOrientation:orientation counter:NO];
    [views enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) {
        // Rotate the view controller
        view.transform = t1;
        [view.subviews enumerateObjectsUsingBlock:^(UIView *counterView, NSUInteger idx, BOOL *stop) {
            // Counter-rotate the controlsUIin the view controller
            counterView.transform = t2;
        }];
    }];
}

+ (CGAffineTransform)pinnedViewTansformForOrientation:(UIInterfaceOrientation)orientation counter:(BOOL)counter {
    CGAffineTransform t;
    switch ( orientation ) {
        case UIInterfaceOrientationPortrait:
        case UIInterfaceOrientationPortraitUpsideDown:
            t = CGAffineTransformIdentity;
            break;

        case UIInterfaceOrientationLandscapeLeft:
            t = CGAffineTransformMakeRotation(counter ? M_PI_2 : -M_PI_2);
            break;

        case UIInterfaceOrientationLandscapeRight:
            t = CGAffineTransformMakeRotation(counter ? -M_PI_2 : M_PI_2);
            break;
    }

    return t;
}

@end

So sieht die Feder aus:

Das UIView mit dem Namen pinned in der Feder ist das IBOutlet von pinnedControls:

Wenn ich dies im Hochformat unter iOS7 oder iOS8 ausführe, erhalte ich Folgendes:

Und ich sehe das gewünschte Ergebnis unter iOS7 im Querformat:

Aber unter iOS8 (GM) bekomme ich dieses Verhalten nicht. Das sehe ich stattdessen:

Beachten Sie, dass die Mitte des UILabels mit dem Text "Angeheftetes Etikett" den Abstand zum unteren Rand des angehefteten UIView beibehält, dessen Größe sich nicht geändert hat, um der Drehung Rechnung zu tragen. In diesem UIView sind alle Kanten an der oberen, linken, unteren und rechten Seite der Superansicht angeheftet.

Es sieht für mich so aus, als ob die Transformationseigenschaft unter iOS8 anders mit Auto Layout interagiert. Ich bin hier ein bisschen ratlos. Ich weiß, dass ich mich nicht auf den Rahmen verlassen kann. Ich fange vielleicht einfach an, Grenzen manuell zu setzen, aber das scheint einfach das Falsche zu sein. Im Grunde genommen mache ich einen End Run um Auto Layou

Antworten auf die Frage(3)

Ihre Antwort auf die Frage