14

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

该类显示界面显示以下方法可在新操作系统版本中使用

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

有谁知道如何使用它?

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

4

4 回答 4

36

您可以使用以下代码:

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

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

于 2016-12-20T17:58:14.307 回答
8

我也想知道,最终找到了苹果对此的解释。

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

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

于 2018-07-09T12:44:54.960 回答
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;
}
于 2017-12-18T18:02:29.443 回答
1

最低代码:

MPMediaItemArtwork(boundsSize: image.size) { _ in image }
于 2019-03-15T03:28:23.700 回答