0

我正在实现一个 3D Touch 预览(peek)视图控制器,以在用力按下 PHAsset 时显示。我返回的视图控制器previewingContext:viewControllerForLocation:只是全屏显示照片。我目前没有preferredContentSize在那个视图控制器上设置,所以系统可以根据需要调整它的大小。因此,当照片不完全适合框架时,照片上方和下方会有一些额外的填充(或者如果我使用 ScaleAspectFill 而不是 Fit,照片会被裁剪)。我想确保不会发生这种情况 - 照片应该完全适合预览框架,没有额外的填充和裁剪。我的问题是,如何确定正确的尺寸?

PHAssetpixelWidthpixelHeight这可能非常有用。但是在Apple 的示例代码中,它指出在设置内容大小时提供的宽度应该为零,因为它不用于纵向。我可以确认它确实忽略了纵向宽度,但没有忽略横向宽度。所以我想我可以在预览视图控制器中检测视图的宽度,viewWillAppear例如,并使用它来执行计算,但这会返回与全屏相同的宽度(iPhone 6s 为 375)。

如何设置preferredContentSize适合全尺寸图像的纵横比?

//Width should be zero, because it's not used in portrait.
photoViewController.preferredContentSize = CGSize(width: 0.0, height: 0.0)

请注意,Dropbox 应用程序的行为符合预期 - 预览窗口的大小适合正在预览的照片。当然还有照片应用程序。

4

2 回答 2

3

对此进行了更多思考,我想出了一个很好的解决方案。只是一点数学。:)

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    if self.isShowingAsPreview {
        let photoWidth = self.asset.pixelWidth
        let photoHeight = self.asset.pixelHeight
        let viewWidth = self.view.frame.size.width
        let widthAspectRatio = CGFloat(photoWidth) / viewWidth

        self.preferredContentSize = CGSizeMake(0, CGFloat(photoHeight) / widthAspectRatio)
    }
}

因为在纵向中宽度被忽略,所以您可能希望将imageView's设置contentMode.ScaleAspectFill偷看时和.ScaleAspectFit弹出时。

于 2016-01-04T04:58:32.107 回答
1

但是,我必须解决同样的问题,不是使用 PHAsset,而是使用“正常”图像。

我对您的回答的问题是,它self.view.frame.size.width没有返回正确的值viewWillAppear,因为视图在被调用时尚未布局。此外,我不想更改contentMode.

这是我的解决方案,对我来说总是正确的preferredContentSize(纵向和横向):

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    if (self.isShowingAsPreview) {
        CGFloat viewWidth = self.view.frame.size.width;
        CGFloat viewHeight = self.view.frame.size.height;
        // Doesn't need to be an PHAsset, just get your image's size.
        CGFloat imageAspectRatio = self.asset.pixelWidth / self.asset.pixelHeight;

        if (viewWidth / viewHeight > imageAspectRatio) { // Height is limiting size
            self.preferredContentSize = CGSizeMake(viewHeight*imageAspectRatio, viewHeight);
        }
        else { // Width is limiting size
            self.preferredContentSize = CGSizeMake(viewWidth, viewWidth/imageAspectRatio);
        }
    }
}
于 2016-02-13T10:31:40.333 回答