我希望我的视图控制器具有相同的自定义 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 组合,它们可以相互通信的主要内容,如果未能解决你的问题,请参考以下文章

我的自定义 UIView 没有收到触摸

如何响应从 xib 加载的自定义视图中发生的操作?

使用来自多个视图控制器的自定义 UIView

将信息发送到我在导航控制器中返回的视图

来自 XIB 的自定义 UIView 加载具有巨大规模的子视图

自定义 UIView 重绘视图控制器