2016-12-16 5 views
4

Apple a désapprouvé la méthode init(image:) dans MPMediaItemArtwork dans iOS 10. Quelle est la nouvelle alternative.MPMediaItemArtwork init (obsolète) obsolète dans iOS 10.0

la classe montre l'interface montre la méthode ci-dessous pour être disponible dans la nouvelle version OS

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

Quelqu'un sait comment l'utiliser?

question également 2, une partie de la question précédente: Est-ce montrant maintenant jouer métadonnées sur le verrouillage écran et contrôle central à l'aide MPNowPlayingInfoCenter travail dans le simulateur?

Répondre

18

Vous pouvez utiliser le code suivant:

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

Et, oui, « lecture en cours » métadonnées montre sur le centre de contrôle dans le simulateur.

+0

Pouvez-vous nous éclairer sur le "pourquoi" et le "comment" (l'enfer ...) cet initialiseur MPMediaItemArtwork est-il utilisé? Qu'attend-on de ce bloc? retourner un UIImage à la taille fournie? Je fais des recherches sur le Web et je ne peux pas obtenir une documentation raisonnable à ce sujet. –

+1

@MottiShneor Différentes tailles d'images sont nécessaires - centre de contrôle, écran de verrouillage, centre de contrôle étendu, iPhone, iPad. Si votre média comporte des illustrations de différentes tailles, vous pouvez renvoyer le média approprié lorsque iOS le demande. –

+0

Mais vous retournez la même image encore et encore, indépendamment de la taille? l'image sera-t-elle redimensionnée pour s'adapter? est-ce acceptable? –

3

J'ai vu tout à l'heure et je suis confus aussi, mais je suppose que cela est la bonne façon:

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

La méthode - dans mon cas dans un singleton « 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; 
}