Установить семейство шрифтов в TVML

В моем приложении TVML я могу установить свойства стиля шрифта, такие как размер шрифта и вес шрифта, используя tv-text-style: нет, однако я не могу установить свойство font-family, которое, кажется, игнорируется:

var Template = function() { return `<?xml version="1.0"    encoding="UTF-8" ?>  
<document>  
    <head>  
        <style>  
            .customText {  
                tv-text-style: none;  
                tv-position: center;  
                color: white;  
                font-size: 40px;  
                font-weight: bold;  
                font-family: Courier;  
            }  
        </style>  
    </head>  
    <paradeTemplate>  
...  
                <listItemLockup>  
                    <title>Title</title>  
                    <relatedContent>  
                         <divTemplate>  
                             <title class="customText">abcABC</title>  
                         </divTemplate>  
                    </relatedContent>  
                </listItemLockup>  
...

Могу ли я установить семейство шрифтов, отличное от семейства системных шрифтов?

Спасибо за вашу помощь,

Лука

2 ответа

Если вы хотите использовать пользовательский шрифт для вашего заголовка, вы должны реализовать пользовательский TVViewElement который будет использовать любой шрифт. Прежде всего, вам нужно реализовать свой собственный TVInterfaceFactory, это можно сделать так (решение Swift 2 для tvOS 9):

import UIKit
import TVMLKit

class MyFactory: TVInterfaceFactory {

    override func viewForElement(element: TVViewElement, existingView: UIView?) -> UIView? {

        switch element {

        case let element as MyText where element.elementName == "myCustomText":
            let view = MyTextView(frame: CGRectMake(0,0,100,50))
            view.text = "my text"
            return view

        default:

            break
        }
        return nil
    }
}

После этого вам нужно реализовать собственный TVML-элемент:

class MyText: TVTextElement {

    override var elementName: String {

        return "myCustomText"
    }

    var text: String? {

        guard let textValue = attributes?["text"] else { return nil }
        return textValue
    }
}

И теперь вам нужно реализовать UIView для вашего TVTextElement:

class MyTextView: UIView {

    var label: UILabel!

    override init(frame: CGRect) {

        super.init(frame: frame)
    }

    var text : String {
        get {

            return self.text
        }
        set(value) {

            self.label = UILabel(frame: self.frame)
            self.label.text = value
            self.label.textColor = UIColor.whiteColor()
            self.label.font = UIFont(name: "Your custom font", size: 20.0)
            self.addSubview(self.label)
        }
    }

    required init?(coder aDecoder: NSCoder) {

        fatalError("init(coder:) has not been implemented")
    }
}

Теперь вы можете использовать свой пользовательский элемент в TVML следующим образом:

<myCustomText text="hello world"></myCustomText>

Кроме того, не забудьте зарегистрировать свой элемент в didFinishLaunchingWithOptions метод:

TVInterfaceFactory.sharedInterfaceFactory().extendedInterfaceCreator = MyFactory()
TVElementFactory.registerViewElementClass(MyText.self, forElementName: "myCustomText")

font-family теперь доступен в TVML. Не нужно использовать TVInterfaceFactory для поддержки пользовательских шрифтов больше.

Пример:

tv-text-style: 'none'
font-family: 'Times New Roman'

Справочник по языку разметки Apple TV: font-family

Другие вопросы по тегам