2

似乎有一些与我的问题相关的帖子,但似乎没有任何帮助。使用自动布局时,如何调整 CALayer 的锚点?

我有我的应用程序的缩放预览(作为教程),标准视图(和视图控制器)按比例缩小并显示在另一个视图上。

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

为此,我使用以下代码:

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

我还需要这个缩放视图与教程视图控制器对齐。为此,我创建了一个“占位符视图”,我希望我的缩放视图在大小上匹配。

为此,我使用:

-(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];
}
4

1 回答 1

2

对我来说,这似乎是一个 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)]

于 2014-09-23T13:45:02.603 回答