我正在Apple tvOS中实现TopShelf。我已下载图片并已分配到 TVContentItems 的 imageURL 。下载的图像宽高比不适合TopShelf图像。我试图通过在图像链接上附加宽度+高度来改变大小。
www.mydownloadedimages.com/ {宽度}×{身高}
但它不起作用。
我可以通过其他任何方式在客户端调整大小。在TVContentItem类中,我只有NSURL对象。没有UIImage对象。
非常感谢。
这是Apple关于图像大小和形状的文档
var WordJumpSelection = (function() {
var watchList = [];
var WordJumpSelection = {
stopWatching: function(elem) {
var wlIdx = watchList.indexOf(elem);
if(wlIdx > -1) watchList.splice(wlIdx,1);
},
watch: function(elem) {
var elems = Array.prototype.slice.call(typeof elem.length === "number" ? elem : arguments);
if(watchList.length === 0)
{
WordJumpSelection.init();
}
elems.forEach(function(elem) {
if(watchList.indexOf(elem) === -1)
{
watchList.push(elem);
}
});
},
init: function() {
function handleSelectionChange() {
if(watchList.length === 0) return;
var selection = window.getSelection();
var selDir = getSelectionDir(selection);
var startNode,endNode,startPos,endPos;
if(selDir === 1)
{
startNode = selection.anchorNode;
endNode = selection.focusNode;
startPos = selection.anchorOffset;
endPos = selection.focusOffset;
}
else
{
startNode = selection.focusNode;
endNode = selection.anchorNode;
startPos = selection.focusOffset;
endPos = selection.anchorOffset;
}
var rangeStart = textNodeIsWatched(startNode) ? roundSelectionIndex(startNode,0,startPos) : startPos-1;
var rangeEnd = textNodeIsWatched(endNode) ? roundSelectionIndex(endNode,1,endPos) : endPos;
var r = document.createRange();
r.setStart(startNode,rangeStart+1)
r.setEnd(endNode,rangeEnd)
selection.removeAllRanges();
selection.addRange(r);
}
document.documentElement.addEventListener('mouseup', handleSelectionChange);
document.documentElement.addEventListener('keyup', function(e) {
if(e.keyCode === 16)
{
handleSelectionChange();
}
});
WordJumpSelection.init = function(){};
}
};
return WordJumpSelection;
function getSelectionDir(sel) {
var range = document.createRange();
range.setStart(sel.anchorNode,sel.anchorOffset);
range.setEnd(sel.focusNode,sel.focusOffset);
if(range.startContainer !== sel.anchorNode || (sel.anchorNode === sel.focusNode && sel.focusOffset < sel.anchorOffset)) return -1;
else return 1;
}
function roundSelectionIndex(textNode,nodeId,idx) {
var isStart = nodeId === 0;
var contents = textNode.textContent;
var nearestSpaceIdx = -1;
if(isStart)
{
nearestSpaceIdx = contents.lastIndexOf(' ',idx);
if(nearestSpaceIdx === -1) nearestSpaceIdx = -1;
}
else
{
nearestSpaceIdx = contents.indexOf(' ',idx);
if(nearestSpaceIdx === -1) nearestSpaceIdx = contents.length;
}
return nearestSpaceIdx;
}
function textNodeIsWatched(textNode) {
return watchList.indexOf(textNode.parentElement) > -1;
}
})();
当此属性的值对Top Shelf样式无效时,系统保留以任何方式缩放图像的权利。
答案 0 :(得分:4)
你是对的,TVContentItem
没有UIImage
类型属性。由于TVContentItem
也接受imageURL
属性中的本地文件网址,因此可以采用以下方法:
UIImage
NSCacheDirectory
imageURL
。以下是步骤:
让我们创建我们的TVContentItem
对象:
let identifier = TVContentIdentifier(identifier: "myPicture", container: wrapperID)!
let contentItem = TVContentItem(contentIdentifier: identifier )!
设置contentItem
的{{1}}:
imageShape
从互联网上抓取图片。实际上我是同步完成的,你也可以尝试使用其他异步方法来获取它(contentItem.imageShape = .HDTV
,AFNetworking等...):
NSURLConnection
准备保存图片的路径,并从let data : NSData = NSData(contentsOfURL: NSURL(string: "https://s3-ak.buzzfed.com/static/2014-07/16/9/enhanced/webdr08/edit-14118-1405517808-7.jpg")!)!
对象获取UIImage
:
data
假设您已设置let filename = "picture-test.jpg"
let paths = NSSearchPathForDirectoriesInDomains(.CachesDirectory, .UserDomainMask, true)
let filepath = paths.first! + "/" + filename
let img : UIImage = UIImage(data: data)!
属性,请使用方法topShelfStyle
获取顶层图片的大小。这将是图像上下文的大小:
TVTopShelfImageSizeForShape
创建let shapeSize : CGSize = TVTopShelfImageSizeForShape(contentItem.imageShape, self.topShelfStyle)
大小的图像上下文,并将下载的图像绘制到上下文中。在这里,您可以对图像进行所有修改,将其调整为所需的大小。在这个例子中,我从Instagram拍摄了一张方形图像,并在左右两侧放置了白色信箱带。
shapeSize
最后,将此图片保存到UIGraphicsBeginImageContext(shapeSize)
let imageShapeInRect : CGRect = CGRectMake((shapeSize.width-shapeSize.height)/2,0,shapeSize.height,shapeSize.height)
img.drawInRect(imageShapeInRect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
并将图片路径设置为NSCacheDirectory
的{{1}}。
contentItem
答案 1 :(得分:0)
我想补充Nicola Giancecchi的回答。 Top Shelf扩展将在非主线程上运行,因此使用UIImageJPEGRepresentation
或UIImagePNGRepresentation
等方法有时会停止Top Shelf线程在控制台中打印:
程序以退出代码结束:0
要解决此问题,您可以像这样包装代码:
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
}
}