IOS 8 CGAffineTransformMakeScale + autolayout больше не работает

Кажется, что есть какая-то статья, связанная с моей проблемой, но никто не помогает. Как настроить опорную точку CALayer, когда используется автоматический макет?

У меня есть расширенный предварительный просмотр моего приложения (в качестве учебника), который стандартное представление (и viewcontroller) сокращается и отображается на другом представлении.

=============
=           =
= --------- =
= -       - =
= -Preview- =
= -       - =
= --------- =
=    View   =
=============

Для этого я использую этот код:

previewViewController.view.transform = CGAffineTransformMakeScale(scale*2, scale*2);

Мне также нужно, чтобы это масштабированное представление выравнивалось с контроллером представления учебника. Для этого я создал "placeholder view", который я хочу, чтобы мое масштабированное представление соответствовало размеру.

Для этого я использую:

-(void)setConstraintsForPreviewViewController
{
    NSArray *attributes = @[@(NSLayoutAttributeLeftMargin), @(NSLayoutAttributeRightMargin), @(NSLayoutAttributeTopMargin), @(NSLayoutAttributeBottomMargin)];
    [attributes enumerateObjectsUsingBlock:^(NSNumber *obj, NSUInteger idx, BOOL *stop) {
        NSLayoutAttribute attribute = [obj integerValue];
        [self.view addConstraint:[NSLayoutConstraint constraintWithItem:self.viewControllerPlaceholderView
                                                              attribute:attribute
                                                              relatedBy:NSLayoutRelationEqual
                                                                 toItem:previewViewController.view
                                                              attribute:attribute
                                                             multiplier:1
                                                               constant:0]];
    }];
}

Это работало хорошо я iOS 7, но построение с XCode 6 и iOS 8, похоже, сломалось. Похоже, теперь он сначала устанавливает ограничения (приспосабливаются к заполнителю), а затем масштабирует его (что приводит к слишком маленькому просмотру).

код:

-(void)setupPreviewViewController
{
    float scale = [self scale];
    previewViewController = [self.storyboard instantiateViewControllerWithIdentifier:[PLACEHOLDER_VIEWCONTROLLER_NAMES objectAtIndex:self.identifier]];

    previewViewController.view.transform = CGAffineTransformMakeScale(scale*2, scale*2);

    [self.view addSubview:previewViewController.view];
    previewViewController.view.translatesAutoresizingMaskIntoConstraints = NO;

    [self addChildViewController:previewViewController];

    [self setConstraintsForPreviewViewController];

    self.viewControllerPlaceholderToImageViewSpaceConstraint.constant = ([self hasNavigationBar] ? (44 * scale * 2) : -22 * scale * 2);

    self.viewControllerPlaceholderToBottomSpaceConstraint.constant = IS_WIDESCREEN ? 160 : 131;

    previewViewController.view.userInteractionEnabled = NO;

    [self.view setNeedsLayout];
}

Ответ 1

Мне кажется, что я похож на iOS 8. Я была такая же проблема. Мое решение состояло в том, чтобы отключить автозапуск для предварительного просмотра и прибегнуть к autoresizingMask.

preview.translatesAutoresizingMaskIntoConstraints = YES;
preview.autoresizingMask = (UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth);
preview.frame = view.bounds;

Но мой предварительный просмотр - это простой UIImageView. Я не знаю, как это будет работать с каким-то сложным предварительным просмотром на основе автозапуска.

У меня довольно похожая настройка, как у вас, я тоже использую VC-заполнителя наверху, но она также была построена с использованием autoresizingMask, казалось, что проще сосредоточить вещи по вертикали.

Если вы используете какие-либо ограничения внутри предварительного просмотра и проблемы с воспроизведением, я бы попытался обернуть предварительный просмотр еще одним UIView и посмотреть, работает ли он. [view (autoresizingMask, custom frame, scaled)] -> [view (autoresizingMask = Flexible W+H)] -> [Preview (Autolayout)]