2016-01-30 6 views
5

Ich implementiere TopShelf in Apple TVOS. Ich habe Bilder heruntergeladen und zugewiesen imageURL von TVContentItems. Das Bildseitenverhältnis der heruntergeladenen Bilder passt nicht ordnungsgemäß in die TopShelf-Bilder. Ich habe versucht, die Größe zu ändern, indem Sie Breite + Höhe an die Bildverbindung anfügen.AppleTv/TvOS - Resize TopShelf Bilder in TVContentItems gespeichert in ImageURL

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

Aber es hat nicht funktioniert.

Kann ich die Änderung der Größe am Client-Ende auf andere Weise vornehmen? In der TVContentItem-Klasse habe ich nur ein NSURL-Objekt. Es gibt kein UIImage-Objekt.

Vielen Dank.

Hier ist die Dokumentation von Apple auf Bildgrößen und Formen

// ~ 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 

Wenn der Wert dieser Eigenschaft nicht gültig für den Top Shelf-Stil ist, behält das System das Recht vor, das Bild in irgendeiner Weise zu skalieren.

Antwort

4

Sie haben Recht damit, dass die TVContentItem keine UIImage Typeigenschaft hat. Da TVContentItem auch lokalen Datei-URLs in der imageURL Eigenschaft akzeptiert, kann eine Abhilfe sein:

  • die UIImage aus dem Internet erregende
  • einen neuen Bild Zusammenhang mit der Größe der obersten Regal Bild erzeugt
  • es zu speichern in Die NSCacheDirectory
  • Einstellung der lokalen Bild-URL als imageURL.

Hier sind die Schritte:

  1. Lassen Sie uns unser TVContentItem-Objekt erstellen:

    let identifier = TVContentIdentifier(identifier: "myPicture", container: wrapperID)! 
    let contentItem = TVContentItem(contentIdentifier: identifier)! 
    
  2. Stellen Sie den contentItem ‚s imageShape:

    contentItem.imageShape = .HDTV 
    
  3. G rab das Bild aus dem Internet. Eigentlich habe ich diese synchron, können Sie auch versuchen, andere Asynchron-Methoden zu verwenden, das zu bekommen (NSURLConnection, AFNetworking, etc ...):

    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. Bereiten Sie den Pfad, in dem das Bild gespeichert werden und erhalten Sie Ihre UIImage vom data Objekt:

    let filename = "picture-test.jpg" 
    let paths = NSSearchPathForDirectoriesInDomains(.CachesDirectory, .UserDomainMask, true) 
    let filepath = paths.first! + "/" + filename 
    let img : UIImage = UIImage(data: data)! 
    
  5. Sie haben Angenommen, die topShelfStyle Eigenschaft bereits gesetzt ist, mit dem Verfahren TVTopShelfImageSizeForShape die Größe des obersten Regal Bild bekommen.Dies wird die Größe des Bildes Kontext sein:

    let shapeSize : CGSize = TVTopShelfImageSizeForShape(contentItem.imageShape, self.topShelfStyle) 
    
  6. Erstellen Sie Ihr Bild Kontext shapeSize Größe und das heruntergeladene Bild in den Kontext rect ziehen. Hier können Sie alle Änderungen an dem Bild vornehmen, um es auf die gewünschte Größe anzupassen. In diesem Beispiel habe ich ein quadratisches Bild von Instagram genommen und weiße Letterbox-Bänder auf die rechte und linke Seite gelegt.

    UIGraphicsBeginImageContext(shapeSize) 
    let imageShapeInRect : CGRect = CGRectMake((shapeSize.width-shapeSize.height)/2,0,shapeSize.height,shapeSize.height) 
    img.drawInRect(imageShapeInRect) 
    let newImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    
  7. Am Ende speichern das Bild in Ihre NSCacheDirectory und den Image-Pfad als contentItem ‚s imageURL gesetzt.

    UIImageJPEGRepresentation(newImage, 0.8)!.writeToFile(filepath, atomically: true) 
    contentItem.imageURL = NSURL(fileURLWithPath: filepath) 
    
  8. Vervollständigen Sie Ihre TVContentItem mit anderen Details (wie Titel, interner Link, etc ...), die obersten Regal Verlängerung laufen ... et voilà! tvOS Screenshot

+0

Ich habe etwas ähnliches versucht, wie von Niccola vorgeschlagen. Ich bin auf das Problem gestoßen, dass der Topshelf-Prozess getötet wird, wenn die Vorbereitung der Topshelf-Items zu lange dauert. Also habe ich die Erstellung der Bilder in meine App verschoben, da sich die Bilder nicht so oft ändern. Vom Topshelf dereferenziere ich dann die erstellten Bilddateien. Dies setzt voraus, dass die App einmal gestartet werden muss, bevor das Topshelf Bilder anzeigen kann. Ein anderes Problem besteht darin, dass Bilder des Top-Shelfs zwischengespeichert werden. Auch wenn die Bilder von der App neu geschrieben werden, werden die Bilder, die im Topshelf angezeigt werden, nicht aktualisiert. Also sei vorsichtig damit. – ssb

0

würde Ich mag an Nicola Giancecchi Antwort hinzuzufügen. Die Verlängerung Top Shelf wird auf einem Nicht-Haupt-Thread ausgeführt, so Methoden wie UIImageJPEGRepresentation oder UIImagePNGRepresentation verwendet, wird manchmal die Top Shelf Thread dies in der Konsole Druck stoppen:

Programm mit Exit-Code beendet: 0

Um dies zu beheben, können Sie Ihren Code wie folgt umhüllen:

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 
    } 
} 
Verwandte Themen