我希望我的视图控制器具有相同的自定义 UIView 组合,它们可以相互通信
Posted
技术标签:
【中文标题】我希望我的视图控制器具有相同的自定义 UIView 组合,它们可以相互通信【英文标题】:I want my view controllers to have the same combination of custom UIViews which communicate with each other 【发布时间】:2017-04-28 09:41:30 【问题描述】:我希望我的几个视图控制器在底部有一个播放器。该播放器由 2 个视图组成:播放器和一个切换它的按钮(可以隐藏或展开)。
现在我在每个视图控制器中使用下面的代码来添加这个播放器。
@IBOutlet weak var broadcastView: BroadcastView!
@IBOutlet weak var broadcastViewBottomConstraint: NSLayoutConstraint!
@IBOutlet weak var avatarImageView: UIImageView!
@IBAction func toggleBroadcastMode(_ sender: ToggleBroadcastButton)
if sender.isExpanded
broadcastViewBottomConstraint.hideBroadcastView()
else
broadcastViewBottomConstraint.expandBroadcastView()
animateBroadcastToggle()
sender.toggle()
broadcastView.toggleBroadcastView()
有没有办法不一遍又一遍地复制代码?也许我可以创建父 VC 或 View 来做到这一点?如果是,那怎么办?
【问题讨论】:
你可以使用containerview
。
因为我没用过,能不能给个更详细的解释?
【参考方案1】:
我个人会将 UINavigationController 子类化并将其放入其中,这样您就可以在流程中导航,而玩家在底部保持良好状态,如果您需要 VC 与之交互,那么您可以
if let nav = navigationController as? MyPlayerNavController
nav.PlayThis()
你可以让它改变大小和从那里开始的所有东西,你不会在转换和播放音乐时丢失它,比如音乐应用程序。
【讨论】:
【参考方案2】:将其添加为 keyWindow 的子视图。这样,它将始终保留在所有 viewControllers 中。
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var overlayViewFrame = UIScreen.main.bounds
overlayViewFrame.origin.y = overlayViewFrame.height - 200
overlayViewFrame.size.height = 200
let overlayView = UIView(frame:overlayViewFrame)
overlayView.backgroundColor = UIColor.cyan
UIApplication.shared.keyWindow?.addSubview(overlayView)
此代码是示例通用代码。如果您希望某些 VC 不显示此内容,请将此叠加视图保持在单例中,并隐藏在适当的 VC 中。
输出截图:
【讨论】:
以上是关于我希望我的视图控制器具有相同的自定义 UIView 组合,它们可以相互通信的主要内容,如果未能解决你的问题,请参考以下文章