AppleTv / TvOS - 调整TVContentItems中的TopShelf图像大小保存到ImageURL

时间:2016-01-30 17:05:32

标签: swift tvos apple-tv

我正在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样式无效时,系统保留以任何方式缩放图像的权利。

2 个答案:

答案 0 :(得分:4)

你是对的,TVContentItem没有UIImage类型属性。由于TVContentItem也接受imageURL属性中的本地文件网址,因此可以采用以下方法:

  • 从互联网上抓取UIImage
  • 使用顶部货架图像的大小创建新的图像上下文
  • 将其保存到NSCacheDirectory
  • 将本地图片网址设置为imageURL

以下是步骤:

  1. 让我们创建我们的TVContentItem对象:

    let identifier = TVContentIdentifier(identifier: "myPicture", container: wrapperID)!
    let contentItem = TVContentItem(contentIdentifier: identifier )!
    
  2. 设置contentItem的{​​{1}}:

    imageShape
  3. 从互联网上抓取图片。实际上我是同步完成的,你也可以尝试使用其他异步方法来获取它(contentItem.imageShape = .HDTV ,AFNetworking等...):

    NSURLConnection
  4. 准备保存图片的路径,并从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
  5. 假设您已设置let filename = "picture-test.jpg" let paths = NSSearchPathForDirectoriesInDomains(.CachesDirectory, .UserDomainMask, true) let filepath = paths.first! + "/" + filename let img : UIImage = UIImage(data: data)! 属性,请使用方法topShelfStyle获取顶层图片的大小。这将是图像上下文的大小:

    TVTopShelfImageSizeForShape
  6. 创建let shapeSize : CGSize = TVTopShelfImageSizeForShape(contentItem.imageShape, self.topShelfStyle) 大小的图像上下文,并将下载的图像绘制到上下文中。在这里,您可以对图像进行所有修改,将其调整为所需的大小。在这个例子中,我从Instagram拍摄了一张方形图像,并在左右两侧放置了白色信箱带。

    shapeSize
  7. 最后,将此图片保存到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
  8. 使用其他详细信息(如标题,内部链接等)完成您的imageURL,运行顶部扩展程序......等等! tvOS Screenshot

答案 1 :(得分:0)

我想补充Nicola Giancecchi的回答。 Top Shelf扩展将在非主线程上运行,因此使用UIImageJPEGRepresentationUIImagePNGRepresentation等方法有时会停止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
    }
}