【发布时间】:2017-09-21 12:18:06
【问题描述】:
我正在尝试实现一个名为 MediaView 的自定义 UIView。
在里面,我默认会有一个加载指示器。在它之上,将显示图像、GIF 或视频。那里只会绘制一个 IBOutlet。
我怎样才能做到这一点?
class MediaView: UIView{
@IBOutlet weak var loadingIndicator : LoadingActivityIndicator!
@IBOutlet weak var apngImageView : APNGImageView?
@IBOutlet weak var animatedImageView : AnimatedImageView?
@IBOutlet weak var player : Player?
// MARK: - Initializers
override init(frame: CGRect) {
super.init(frame: frame)
setupView()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupView()
}
// MARK: - Private Helper Methods
// Performs the initial setup.
private func setupView() {
let view = viewFromNibForClass()
view.frame = bounds
// Auto-layout stuff.
view.autoresizingMask = [
UIViewAutoresizing.FlexibleWidth,
UIViewAutoresizing.FlexibleHeight
]
// Show the view.
addSubview(view)
}
// Loads a XIB file into a view and returns this view.
private func viewFromNibForClass() -> UIView {
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: String(describing: type(of: self)), bundle: bundle)
let view = nib.instantiate(withOwner: self, options: nil).first as! UIView
return view
}
}
【问题讨论】:
-
你不能只为你不想想看的两个设置
.isHidden = true,为你想看的一个设置.isHidden = false想看吗? -
我只想使用其中之一。即使是 '.isHidden = true' 对象也会在层次结构中存活。
-
好的 - 然后
.removeFromSuperview()? -
如果我没记错的话,你建议在'func setupView()'中获得一个指示媒体类型的初始化参数后,我应该为不必要的IBOutlets调用'.removeFromSupeview()'。我做对了吗?如果你看到一个优雅的解决方案,我也可以适应它。我只是无法说服自己根据显示的图像类型划分 3 个不同的 UIView 子类。
-
是的,如果您真的希望视图不在层次结构中(也就是说,隐藏是不行的),那么只需删除
.removeFromSuperview()的两个“未使用”视图
标签: ios swift uiview xib iboutlet