I am implementing TopShelf in Apple tvOS. I have downloaded images and assigned to imageURL of TVContentItems. The downloaded images aspect ratio does not fit into the TopShelf Images properly. I have tried to change the size by appending width + height to the image link.
But it didn't work.
Can I do resizing at client end in any other way. In the TVContentItem class I have only have NSURL object. There is no UIImage Object.
Thanks a lot.
Here is Apple's documentation on Image Sizes and shapes
// ~ 2 : 3
// ~ 1 : 1
// ~ 4 : 3
// ~ 16 : 9
// ~ 8 : 3
// ~ 87 : 28
//@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:
You're right saying that the
TVContentItem has no
UIImage type property. Since
TVContentItem also accepts local file URLs in the
imageURL property, a workaround can be:
Here are the steps:
Let's create our
let identifier = TVContentIdentifier(identifier: "myPicture", container: wrapperID)! let contentItem = TVContentItem(contentIdentifier: identifier )!
contentItem.imageShape = .HDTV
Grab the image from Internet. Actually I did this synchronously, you can also try to use other async methods to get that (
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")!)!
Prepare the path where your image will be saved and get your
UIImage from the
let filename = "picture-test.jpg" let paths = NSSearchPathForDirectoriesInDomains(.CachesDirectory, .UserDomainMask, true) let filepath = paths.first! + "/" + filename let img : UIImage = UIImage(data: data)!
Assuming you've already set the
topShelfStyle property, get the size of the top shelf image with the method
TVTopShelfImageSizeForShape. This will be the size of your image context:
let shapeSize : CGSize = TVTopShelfImageSizeForShape(contentItem.imageShape, self.topShelfStyle)
Create your image context of
shapeSize size and draw the downloaded image into the context rect. Here you can do all your modifications to the image to adjust it into the desired size. In this example I took a square image from Instagram and I put white letterbox bands on the right and left sides.
UIGraphicsBeginImageContext(shapeSize) let imageShapeInRect : CGRect = CGRectMake((shapeSize.width-shapeSize.height)/2,0,shapeSize.height,shapeSize.height) img.drawInRect(imageShapeInRect) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext()
In the end, save this image into your
NSCacheDirectory and set the image path as
UIImageJPEGRepresentation(newImage, 0.8)!.writeToFile(filepath, atomically: true) contentItem.imageURL = NSURL(fileURLWithPath: filepath)