MPMediaItemArtwork init(image:) 在 iOS 10.0 中已弃用

Posted

技术标签:

【中文标题】MPMediaItemArtwork init(image:) 在 iOS 10.0 中已弃用【英文标题】:MPMediaItemArtwork init(image:) deprecated in iOS 10.0 【发布时间】:2017-05-02 16:00:13 【问题描述】:

Apple 已弃用 ios 10 中 MPMediaItemArtwork 中的 init(image:) 方法。 什么是新的替代方案。

类显示界面显示方法在新的操作系统版本中可用

public init(boundsSize: CGSize, requestHandler: @escaping (CGSize) -> UIImage)

有人知道怎么用吗?

还有问题 2,上一个问题的一部分:在模拟器中使用MPNowPlayingInfoCenter 在锁屏和控制中心显示正在播放元数据是否有效?

【问题讨论】:

【参考方案1】:

您可以使用以下代码:

let image = UIImage(named: "logo")!
let artwork = MPMediaItemArtwork.init(boundsSize: image.size, requestHandler:  (size) -> UIImage in
        return image
)

而且,是的,“正在播放”元数据会显示在模拟器的控制中心上。

【讨论】:

您能否解释一下使用这个 MPMediaItemArtwork 初始化程序的“为什么”和“如何”(见鬼......)?这个区块的期望是什么?以提供的大小返回 UIImage?我正在网上搜索,但无法获得有关这方面的合理文档。 @MottiShneor 需要各种尺寸的图像——控制中心、锁屏、扩展控制中心、iPhone、iPad。如果您的媒体有不同尺寸的图稿,那么您可以在 iOS 请求时返回相应的媒体。 但是你一次又一次地返回相同的图像,不管大小?图像会调整大小以适应吗?这完全可以接受吗? @MottiShneor - 根据文档,“请求处理程序返回新请求大小的图像。请求的大小必须小于 boundsSize 参数” - 所以这个实现是不正确的。 image 应该在返回之前调整为请求的大小,或者通过resizableImage 方法创建。【参考方案2】:

我也有同样的疑惑,最终找到了 Apple 对此的解释。

他们说我们不应该在请求处理程序时对图像进行任何昂贵的调整大小操作,而是简单地从您已经可用的图像中返回紧密匹配的图像。

他们提到了以下 WWDC 2017 视频。这是关于 tvOS,但至少我们得到了一些见解。 07:20 开始:https://developer.apple.com/videos/play/wwdc2017/251/?time=440

【讨论】:

【参考方案3】:

我刚才看到这个,我也很困惑,但我想这是正确的方法:

self.remoteArtwork = [[MPMediaItemArtwork alloc] initWithBoundsSize:CGSizeMake(600, 600) requestHandler:^UIImage * _Nonnull(CGSize size) 

    UIImage *lockScreenArtworkApp = [UIImage imageNamed:@"lockScreenLogo"];

    return [self.manager resizeImageWithImage:lockScreenArtworkApp scaledToSize:size];        
];

方法 - 在我的例子中是一个单例“Manager”-Class

- (UIImage *)resizeImageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize 
    //UIGraphicsBeginImageContext(newSize);
    // In next line, pass 0.0 to use the current device's pixel scaling factor (and thus account for Retina resolution).
    // Pass 1.0 to force exact pixel size.
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;

【讨论】:

这个答案不是很快,为什么你硬编码 600x600 的边界大小? 我不喜欢 swift 不建议这样做。苹果在视频中这么说,@hybridcattt 在另一个答案中链接了。【参考方案4】:

最低代码:

MPMediaItemArtwork(boundsSize: image.size)  _ in image 

【讨论】:

以上是关于MPMediaItemArtwork init(image:) 在 iOS 10.0 中已弃用的主要内容,如果未能解决你的问题,请参考以下文章

MPMediaItemArtwork 返回尺寸错误的图稿

MPMediaItemArtwork 和透明度

MPNowPlayingInfoCenter:从 URL 设置 MPMediaItemArtwork 的最佳方法是啥?

MPMediaItemArtwork 和 UITableView

矩形图像缩放以适应正方形以与 MPMediaItemArtwork 一起使用

使用 UICollectionView 和 MPMediaItemArtwork 遇到内存泄漏