在 tvOS 12 的 TVUIKit 中使用 TVPosterImage
Using TVPosterImage in TVUIKit for tvOS 12
tvOS 12有了新的框架TVUIKit, which introduces the lockup views. The class I am interested in is TVPosterView,基本上是这样设计的:
Swift 4.2
open class TVPosterView : TVLockupView { // One may use UIControl to implement it in iOS
public init(image: UIImage?)
open var image: UIImage? // default is nil
open var title: String?
open var subtitle: String?
}
在我的故事板中,我添加了一个 UIView 元素,并且正确地(至少我希望如此。昨天 IB 代理一直崩溃!)在 Identity Inspector 中将其 class 更改为 TVPosterView。然后在我的 UIViewController 中我定义了:
@IBOutlet var aPosterView: TVPosterView!
override func viewDidLoad() {
super.viewDidLoad()
if let myIcon = UIImage(named: "icon.png") {
self.aPosterView = TVPosterView(image: myIcon)
self.aPosterView.title = "My Title"
self.aPosterView.subtitle = "A Sub Title"
}
else {
print("ERROR: I couldn't load the icon!")
}
}
}
编译时没有任何警告。当我 运行 它时,它只显示 UIView 白色背景,没有任何变化。我做了一些尝试添加 UIImageView 的测试,但它们都没有定论(当然,当我将 UIImageView 的图像设置为 self.aPosterView.image 时)。
我远不是专家,几周前才开始学习。知道我缺少什么吗?我认为这个概念是,一旦我启动 class 框架就会负责显示带有(可选)标题和副标题的海报,还会处理所有漂亮的动画!
最终我设法让它以编程方式工作。我测试了 TVPosterView 和 TVMonogramView (基本上是一个圆形按钮)。以下代码适用于 Xcode 10 beta 5,在 tvOS 12 beta 5 上:
Swift 4.2
import UIKit
import TVUIKit
class SecondViewController: UIViewController {
var myPoster = TVPosterView()
var myMonogram = TVMonogramView()
override func viewDidLoad() {
super.viewDidLoad()
myPoster.frame = CGRect(x: 100, y: 100, width: 550, height: 625)
myPoster.image = UIImage(named: "image1.png")
myPoster.imageView.masksFocusEffectToContents = true
myPoster.title = "Poster"
myPoster.subtitle = "This is the poster subtitle"
self.view.addSubview(myPoster)
var myName = PersonNameComponents()
myName.givenName = "Michele"
myName.familyName = "Dall'Agata"
myMonogram.frame = CGRect(x: 700, y: 100, width: 500, height: 475)
myMonogram.image = UIImage(named: "image2.png")
myMonogram.title = "Monogram"
myMonogram.subtitle = "This is the Monogram subtitle"
myMonogram.personNameComponents = myName
self.view.addSubview(myMonogram)
print(myMonogram.personNameComponents)
}
}
不过,我没能用 scaleAspectFit 缩放海报的图像。此外,我的第一张图片是圆形的,带有透明度,并且只选择了一个完美适合方形图片和标题的框架尺寸(因此不需要宽高比),发光效果在角落变得透明。否则整个图像是不透明的,使用它自己的(非常小的)圆角。
tvOS 12有了新的框架TVUIKit, which introduces the lockup views. The class I am interested in is TVPosterView,基本上是这样设计的:
Swift 4.2
open class TVPosterView : TVLockupView { // One may use UIControl to implement it in iOS
public init(image: UIImage?)
open var image: UIImage? // default is nil
open var title: String?
open var subtitle: String?
}
在我的故事板中,我添加了一个 UIView 元素,并且正确地(至少我希望如此。昨天 IB 代理一直崩溃!)在 Identity Inspector 中将其 class 更改为 TVPosterView。然后在我的 UIViewController 中我定义了:
@IBOutlet var aPosterView: TVPosterView!
override func viewDidLoad() {
super.viewDidLoad()
if let myIcon = UIImage(named: "icon.png") {
self.aPosterView = TVPosterView(image: myIcon)
self.aPosterView.title = "My Title"
self.aPosterView.subtitle = "A Sub Title"
}
else {
print("ERROR: I couldn't load the icon!")
}
}
}
编译时没有任何警告。当我 运行 它时,它只显示 UIView 白色背景,没有任何变化。我做了一些尝试添加 UIImageView 的测试,但它们都没有定论(当然,当我将 UIImageView 的图像设置为 self.aPosterView.image 时)。
我远不是专家,几周前才开始学习。知道我缺少什么吗?我认为这个概念是,一旦我启动 class 框架就会负责显示带有(可选)标题和副标题的海报,还会处理所有漂亮的动画!
最终我设法让它以编程方式工作。我测试了 TVPosterView 和 TVMonogramView (基本上是一个圆形按钮)。以下代码适用于 Xcode 10 beta 5,在 tvOS 12 beta 5 上:
Swift 4.2
import UIKit
import TVUIKit
class SecondViewController: UIViewController {
var myPoster = TVPosterView()
var myMonogram = TVMonogramView()
override func viewDidLoad() {
super.viewDidLoad()
myPoster.frame = CGRect(x: 100, y: 100, width: 550, height: 625)
myPoster.image = UIImage(named: "image1.png")
myPoster.imageView.masksFocusEffectToContents = true
myPoster.title = "Poster"
myPoster.subtitle = "This is the poster subtitle"
self.view.addSubview(myPoster)
var myName = PersonNameComponents()
myName.givenName = "Michele"
myName.familyName = "Dall'Agata"
myMonogram.frame = CGRect(x: 700, y: 100, width: 500, height: 475)
myMonogram.image = UIImage(named: "image2.png")
myMonogram.title = "Monogram"
myMonogram.subtitle = "This is the Monogram subtitle"
myMonogram.personNameComponents = myName
self.view.addSubview(myMonogram)
print(myMonogram.personNameComponents)
}
}
不过,我没能用 scaleAspectFit 缩放海报的图像。此外,我的第一张图片是圆形的,带有透明度,并且只选择了一个完美适合方形图片和标题的框架尺寸(因此不需要宽高比),发光效果在角落变得透明。否则整个图像是不透明的,使用它自己的(非常小的)圆角。