tvOS:无论如何要在AVPlayer外面显示一个字幕?

时间:2016-10-13 01:58:59

标签: swift avplayer tvos

所以场景是有一个视图,用户可以在我帮助开发的应用程序中启用/禁用字幕。

在该视图中,有一个示例文字说"这是字幕的样子",目前它只是一个基本的,没有样式的UILabel。理想情况下,我希望它的样式与用户在系统设置中自定义字幕的方式类似。

这有可能吗?我设想了两种可能的方法:

  1. 使用文本创建AVPlayer实例和.vtt文件,将其加载到视图中并暂停播放器。我不确定这是否可以使用示例视频(并且由于示例子文本后面有图像,因此它必须是透明的。)

  2. 以某种方式获取用户为其字幕设置的所有样式(字体,大小,背景颜色等)并创建与之匹配的属性字符串

  3. 方法2似乎是最可行的方式,但我不知道我们是否可以访问代码中的这些设置。

1 个答案:

答案 0 :(得分:1)

所以我明白了!它基本上使用Media Accessibility API的组合,它允许您获取用户为其字幕/字幕设置,归属字符串和子类UILabel选择的值(尽管这可能也许UITextView取代,因为这样可以让你原生UIEdgeInsets

因此,首先,子类允许UILabel插入。这是因为字幕可以具有背景颜色和文本高亮颜色,而没有插入,您可以看到文本高亮显示。所以子类的功能很简单:

class InsetUILabel: UILabel {
    override func drawTextInRect(rect: CGRect) {
        let inset: CGFloat = 15
        let insets: UIEdgeInsets = UIEdgeInsets(top: inset, left: inset/2, bottom: inset, right: inset/2)
        super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets))
    }
}

用于生成实际标签。这使用了一个名为textSample的标签,但显然可以使它更加通用。

import MediaAccessibility

func styleLabel(sampleText: String) {
    let domain = MACaptionAppearanceDomain.User

    // Background styling
    let backgroundColor = UIColor(CGColor: MACaptionAppearanceCopyWindowColor(domain, nil).takeRetainedValue())
    let backgroundOpacity = MACaptionAppearanceGetWindowOpacity(domain, nil)
    textSample.layer.backgroundColor = backgroundColor.colorWithAlphaComponent(backgroundOpacity).CGColor
    textSample.layer.cornerRadius = MACaptionAppearanceGetWindowRoundedCornerRadius(domain, nil)

    // Text styling
    var textAttributes = [String:AnyObject]()
    let fontDescriptor = MACaptionAppearanceCopyFontDescriptorForStyle(domain, nil, MACaptionAppearanceFontStyle.Default).takeRetainedValue()
    let fontName = CTFontDescriptorCopyAttribute(fontDescriptor, "NSFontNameAttribute") as! String
    let fontColor = UIColor(CGColor: MACaptionAppearanceCopyForegroundColor(domain, nil).takeRetainedValue())
    let fontOpacity = MACaptionAppearanceGetForegroundOpacity(domain, nil)
    let textEdgeStyle = MACaptionAppearanceGetTextEdgeStyle(domain, nil)
    let textHighlightColor = UIColor(CGColor: MACaptionAppearanceCopyBackgroundColor(domain, nil).takeRetainedValue())
    let textHighlightOpacity = MACaptionAppearanceGetBackgroundOpacity(domain, nil)
    let textEdgeShadow = NSShadow()
    textEdgeShadow.shadowColor = UIColor.blackColor()
    let shortShadowOffset: CGFloat = 1.5
    let shadowOffset: CGFloat = 3.5

    switch(textEdgeStyle) {
    case .None:
        textEdgeShadow.shadowColor = UIColor.clearColor()

    case .DropShadow:
        textEdgeShadow.shadowOffset = CGSize(width: -shortShadowOffset, height: shortShadowOffset)
        textEdgeShadow.shadowBlurRadius = 6

    case .Raised:
        textEdgeShadow.shadowOffset = CGSize(width: 0, height: shadowOffset)
        textEdgeShadow.shadowBlurRadius = 5

    case .Depressed:
        textEdgeShadow.shadowOffset = CGSize(width: 0, height: -shadowOffset)
        textEdgeShadow.shadowBlurRadius = 5

    case .Uniform:
        textEdgeShadow.shadowColor = UIColor.clearColor()
        textAttributes[NSStrokeColorAttributeName] = UIColor.blackColor()
        textAttributes[NSStrokeWidthAttributeName] = -2.0

    default:
        break
    }

    textAttributes[NSFontAttributeName] = UIFont(name: fontName, size: (textSample.font?.pointSize)!)
    textAttributes[NSForegroundColorAttributeName] = fontColor.colorWithAlphaComponent(fontOpacity)
    textAttributes[NSShadowAttributeName] = textEdgeShadow
    textAttributes[NSBackgroundColorAttributeName] = textHighlightColor.colorWithAlphaComponent(textHighlightOpacity)

    textSample.attributedText = NSAttributedString(string: sampleText, attributes: textAttributes)
}

现在文本高亮部分使用阴影,我认为值看起来很不错,但你可能想稍微调整它们。希望这有帮助!