2016-10-13 5 views
2

だから、シナリオは、ユーザが、私が開発に貢献してるアプリで/無効字幕を有効にすることができますビューが存在することです。tvOS:とにかくAVPlayerの外に字幕を表示するには?

この見解には、「これはキャプションがどのようなものなのか」というサンプルテキストがあり、現時点ではそれは単なる基本スタイルではありませんUILabelです。理想的には、ユーザーがシステム設定でキャプションをカスタマイズした方法と同様にスタイルを設定したいと思っています。

は、どのような方法で、このことは可能ですか? 、テキストとAVPlayerインスタンスと.vttファイルを作成ビューにそれをロードし、プレーヤーを一時停止

  1. :私は2つの可能な方法を想定しました。私はこれがサンプルビデオで可能であるかどうかはわかりません(サンプルのサブテキストの後ろに画像があるので、何とか透明でなければなりません)。

  2. どういうわけか、すべてのスタイル(フォント、サイズ、背景色など)は、ユーザーが自分の字幕用に設定し、

方法2が最も実現可能な方法のように思えることを一致させるために起因する文字列を作成していますしかし、コード内のこれらの設定にアクセスできるかどうかはわかりません。

答えて

1

だから私はそれを考え出しました!基本的にはMedia Accessibility APIの組み合わせを使用して、ユーザーがキャプション/サブタイトルの設定、属性付き文字列、サブクラスUILabelの値を取得できるようにします(の場合はUITextView

したがって、最初にサブクラスは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) 
} 

今テキストハイライト部分は、私はかなり良いように見えますが、あなたがそれらをほんの少しを微調整したいかもしれないと思うの値で、影を利用します。お役に立てれば!

関連する問題