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

15

在iOS 10中,Apple已经弃用了MPMediaItemArtwork中的init(image:)方法。新的替代方法是什么?

该类的接口显示以下方法在新的操作系统版本中可用。

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

有人知道如何使用它吗?

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

4个回答

38

您可以使用以下代码:

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

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


你能否解释一下为什么和如何(到底是怎么回事...)使用MPMediaItemArtwork初始化器?这个块期望返回什么?在提供的尺寸下返回一个UIImage吗?我正在搜索网络,但找不到合理的文档。 - Motti Shneor
1
@MottiShneor 需要不同尺寸的图像 - 控制中心、锁屏、扩展控制中心、iPhone、iPad。如果您的媒体具有不同尺寸的艺术品,则可以在iOS请求时返回适当的媒体。 - Matt H
但是你一遍又一遍地返回相同的图像,无论大小如何?这个图像会被调整大小以适应吗?这样做是否可以接受? - Motti Shneor
1
根据文档,"请求处理程序以新请求的大小返回图像。请求的大小必须小于boundsSize参数" - 因此,这个实现是不正确的。在返回之前,image应该被调整为所请求的大小,或者通过resizableImage方法创建。 - Jules

9

我也有同样的疑问,并查找到了苹果公司的解释。

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

下面这个WWDC 2017视频是他们提到这一点的地方。虽然是关于tvOS的,但至少我们能得到一些见识。视频开始于07:20:https://developer.apple.com/videos/play/wwdc2017/251/?time=440


4

我刚刚看到了这个,也感到困惑,但我猜这应该是正确的方式:

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

在我的情况下,这个方法是在一个单例“管理器”类中。

- (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的边界大小? - Jonny
3
我不喜欢 Swift。 - NeoGER89
这并不被推荐。苹果在@hybridcattt在另一个答案中链接的视频中也是这么说的。 - ullstrm

1

最小代码:

MPMediaItemArtwork(boundsSize: image.size) { _ in image }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接