2016-01-30 26 views
5

Sto implementando TopShelf in Apple tvOS. Ho scaricato immagini e assegnato a imageURL di TVContentItems. Le proporzioni delle immagini scaricate non si adattano correttamente alle immagini TopShelf. Ho provato a modificare le dimensioni aggiungendo larghezza + altezza al collegamento dell'immagine.AppleTv/TvOS - Ridimensiona le immagini TopShelf in TVContentItems Salvato in ImageURL

www.mydownloadedimages.com/{width}x{height}

Ma non ha funzionato.

Posso eseguire il ridimensionamento al client in qualsiasi altro modo. Nella classe TVContentItem ho solo oggetti NSURL. Non esiste un oggetto UIImage.

Grazie mille.

Ecco la documentazione di Apple su Immagine dimensioni e forme

// ~ 2 : 3 
// ~ 1 : 1 
// ~ 4 : 3 
// ~ 16 : 9 
// ~ 8 : 3 
// ~ 87 : 28 


//@property imageShape 
//@abstract A TVContentItemImageShape value describing the intended aspect ratio or shape of the image. 
//@discussion For Top Shelf purposes: the subset of values which are //valid in this property, for TVContentItems in the topShelfItems property //of the TVTopShelfProvider, depends on the value of the topShelfStyle //property of the TVTopShelfProvider: 


        TVTopShelfContentStyleInset: 

         valid: TVContentItemImageShapeExtraWide 

        TVTopShelfContentStyleSectioned: 

         valid: TVContentItemImageShapePoster 

         valid: TVContentItemImageShapeSquare 

         valid: TVContentItemImageShapeHDTV 

Quando il valore di questa proprietà non è valida per lo stile Top Shelf, il sistema si riserva il diritto di ridimensionare l'immagine in alcun modo.

risposta

4

Hai ragione dicendo che il TVContentItem non ha la proprietà di tipo UIImage. Dal momento che TVContentItem accetta anche gli URL dei file locali nella proprietà imageURL, una soluzione può essere:

  • afferrando il UIImage da internet
  • la creazione di un nuovo contesto di immagine con la dimensione dell'immagine ripiano superiore
  • risparmio in NSCacheDirectory
  • impostazione dell'URL dell'immagine locale come imageURL.

Ecco i passaggi:

  1. Creiamo il nostro TVContentItem oggetto:

    let identifier = TVContentIdentifier(identifier: "myPicture", container: wrapperID)! 
    let contentItem = TVContentItem(contentIdentifier: identifier)! 
    
  2. Impostare s' il contentItemimageShape:

    contentItem.imageShape = .HDTV 
    
  3. G rab l'immagine da Internet. In realtà ho fatto questo in modo sincrono, si può anche provare a utilizzare altri metodi asincroni per ottenere che (NSURLConnection, AFNetworking, ecc ...):

    let data : NSData = NSData(contentsOfURL: NSURL(string: "https://s3-ak.buzzfed.com/static/2014-07/16/9/enhanced/webdr08/edit-14118-1405517808-7.jpg")!)! 
    
  4. Preparare il percorso in cui verrà salvato l'immagine e ottenere la vostra UIImage dall'oggetto data:

    let filename = "picture-test.jpg" 
    let paths = NSSearchPathForDirectoriesInDomains(.CachesDirectory, .UserDomainMask, true) 
    let filepath = paths.first! + "/" + filename 
    let img : UIImage = UIImage(data: data)! 
    
  5. Supponendo che hai già impostato la proprietà topShelfStyle, ottenere la dimensione dell'immagine ripiano superiore con il metodo TVTopShelfImageSizeForShape.Questa sarà la dimensione del vostro contesto immagine:

    let shapeSize : CGSize = TVTopShelfImageSizeForShape(contentItem.imageShape, self.topShelfStyle) 
    
  6. Crea il tuo quadro immagine di shapeSize dimensioni e disegnare l'immagine scaricata nel contesto rett. Qui puoi apportare tutte le modifiche all'immagine per adattarla alla dimensione desiderata. In questo esempio ho preso un'immagine quadrata da Instagram e ho inserito delle fasce bianche letterbox sui lati destro e sinistro.

    UIGraphicsBeginImageContext(shapeSize) 
    let imageShapeInRect : CGRect = CGRectMake((shapeSize.width-shapeSize.height)/2,0,shapeSize.height,shapeSize.height) 
    img.drawInRect(imageShapeInRect) 
    let newImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    
  7. Alla fine, salvare questa immagine nel vostro NSCacheDirectory e impostare il percorso dell'immagine come contentItem s' imageURL.

    UIImageJPEGRepresentation(newImage, 0.8)!.writeToFile(filepath, atomically: true) 
    contentItem.imageURL = NSURL(fileURLWithPath: filepath) 
    
  8. Completa il tuo TVContentItem ad altri dettagli (come il titolo, link interno, ecc ...), eseguire l'estensione ripiano superiore ... et voilà! tvOS Screenshot

+0

Ho provato qualcosa di simile come suggerito da Niccola. Ho incontrato il problema, che il processo di topshelf viene ucciso, quando la preparazione degli elementi topshelf richiede troppo tempo. Così ho spostato la creazione delle immagini sulla mia app, poiché le immagini non cambiano così spesso. Dal topshelf, quindi, dereference i file di immagine creati. Ciò richiede che l'app debba essere avviata una volta prima che il topshelf possa mostrare le immagini. Un altro problema è che le immagini topshelf sono memorizzate nella cache. Anche quando le immagini vengono riscritte dall'app, le immagini mostrate nella topshelf non vengono aggiornate. Quindi stai attento con questo. – ssb

0

vorrei aggiungere alla risposta di Nicola Giancecchi. L'estensione Top Shelf verrà eseguito su un thread principale in modo da utilizzare metodi come UIImageJPEGRepresentation o UIImagePNGRepresentation a volte fermare il filo Top Shelf la stampa di questo nella console:

programma si è concluso con il codice di uscita: 0

Per risolvere questo problema è possibile avvolgere il codice in questo modo:

DispatchQueue.main.sync { 
    UIImageJPEGRepresentation(newImage, 0.8)!.writeToFile(filepath, atomically: true) 

    let imageURL = NSURL(fileURLWithPath: filepath) 
    if #available(tvOSApplicationExtension 11.0, *) { 
     contentItem.setImageURL(imageURL, forTraits: .userInterfaceStyleLight) 
     contentItem.setImageURL(imageURL, forTraits: .userInterfaceStyleDark) 
    } else { 
     contentItem.imageURL = imageURL 
    } 
}