web-dev-qa-db-ja.com

MPMediaItemArtwork init(image :)はiOS10.0で非推奨になりました

Appleは、iOS10のMPMediaItemArtworkinit(image:)メソッドを非推奨にしました。新しい代替手段は何ですか。

クラスshowsinterfaceは、新しいOSバージョンで使用できる以下のメソッドを示しています

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

誰もがそれを使用する方法を知っていますか?

また、前の質問の一部である質問2:MPNowPlayingInfoCenterを使用してロック画面とコントロールセンターに現在再生中メタデータを表示することはシミュレーターで機能しますか?

12
carbonr

次のコードを使用できます。

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

そして、はい、「再生中」のメタデータがシミュレーターのコントロールセンターに表示されます。

28
Virasio

私は同じことを不思議に思っていて、これについてのAppleの説明を見つけることになった。

彼らは、ハンドラーが要求されたときに画像に対して高価なサイズ変更操作を行うべきではなく、代わりに、すでに利用可能な画像から厳密に一致する画像を返すだけでよいと言っています。

次のWWDC2017ビデオは、彼らが言及しているところです。 tvOSについてですが、少なくともいくつかの洞察を得ることができます。 07:20に開始: https://developer.Apple.com/videos/play/wwdc2017/251/?time=44

5
hybridcattt

私はこれをちょうど今見ました、そして私も混乱しています、しかし私はこれが正しい方法であると思います:

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;
}
4
NeoGER89

最小コード:

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