所有VC的一个UI元素[关闭]

Posted

技术标签:

【中文标题】所有VC的一个UI元素[关闭]【英文标题】:One UI element for all VC [closed] 【发布时间】:2020-11-08 16:38:23 【问题描述】:

如何为所有视图控制器创建带有动画的自定义视图元素,就像一个单独的类一样,这样就不会每次都为每个 VC 编写这个元素。 例如: 我想用按钮创建底部视图,如果我按下按钮动画会出现,我可以为不同的 VC 做不同的动作。

如何为所有 VC 一次性创建这个带有动​​画的视图并在 VC 中实现不同的操作?

我只能为每个 VC 每次都创建它,所有工作都完成了,但它是糟糕的代码,有时可能难以维护。

这是我如何创建底部菜单的示例,这种方式看起来不错,但效果如何。

import Foundation
import UIKit

class BottomMenu: UIViewController 
      
    static let shared = BottomMenu()

    var yPosBottomUIView: CGFloat = 90.0
    var yPosCenterButton: CGFloat = 35
    var yPosBackButton: CGFloat = 35
    var yPosForwardButton: CGFloat = 35
    var yPosContextMenu: CGFloat = 35
    var yPosUpdateButton: CGFloat = 35
    var backButtonEnable: Bool = false
    var forwardButtonEnable: Bool = false
    
    lazy var image: UIImageView = 
        let image = UIImageView(frame: CGRect(x: 0, y: UIScreen.main.bounds.maxY - yPosBottomUIView, width: UIScreen.main.bounds.width, height: 90))
        if (osTheme == .dark) 
            DispatchQueue.main.async 
                image.image = UIImage(named: "SurfaceBlack")
            
            return image
         else 
            DispatchQueue.main.async 
                image.image = UIImage(named: "SurfaceLight")
            
            return image
        
    ()
    
    lazy var centerButton: UIButton = 
        let button = UIButton(frame: CGRect(x: (UIScreen.main.bounds.maxX / 2) - 25, y: (UIScreen.main.bounds.maxY - 50) - yPosCenterButton, width: 50, height: 50))
        
        if (osTheme == .dark) 
            button.backgroundColor = UIColor(red: 0.118, green: 0.118, blue: 0.15, alpha: 1)
         else 
            button.backgroundColor = UIColor(red: 0.118, green: 0.118, blue: 0.15, alpha: 1)
        
        button.layer.cornerRadius = 25
        button.setImage(UIImage(named: "Menu"), for: .normal)
        button.addTarget(self, action: #selector(centralButtonAction), for: .touchUpInside)
        button.isEnabled = false
        return button
    ()
    
    lazy var backButton: UIButton = 
        let button = UIButton(frame: CGRect(x: (UIScreen.main.bounds.minX) + 25, y: (UIScreen.main.bounds.maxY - 15.5) - yPosBackButton, width: 36, height: 36))
        button.backgroundColor = .clear
        button.setImage(UIImage(named: "whiteBackArrow"), for: .normal)
        button.addTarget(self, action: #selector(centralButtonAction), for: .touchUpInside)
        button.isEnabled = backButtonEnable
        return button
    ()
    
    lazy var forwardButton: UIButton = 
        let button = UIButton(frame: CGRect(x: (UIScreen.main.bounds.minX) + 90, y: (UIScreen.main.bounds.maxY - 15.5) - yPosForwardButton, width: 36, height: 36))
        button.backgroundColor = .clear
        button.setImage(UIImage(named: "whiteBackArrow"), for: .normal)
        button.imageView?.transform = CGAffineTransform(rotationAngle: CGFloat.pi)
        button.addTarget(self, action: #selector(centralButtonAction), for: .touchUpInside)
        button.isEnabled = forwardButtonEnable
        return button
    ()
    
    lazy var contextMenu: UIButton = 
        let button = UIButton(frame: CGRect(x: (UIScreen.main.bounds.maxX) - 60, y: (UIScreen.main.bounds.maxY - 15.5) - yPosContextMenu, width: 36, height: 36))
        button.backgroundColor = .clear
        button.setImage(UIImage(named: "ContextMenu"), for: .normal)
        button.addTarget(self, action: #selector(contextMenuButtonAction), for: .touchUpInside)
        return button
    ()
    
    lazy var updateButton: UIButton = 
        let button = UIButton(frame: CGRect(x: (UIScreen.main.bounds.maxX) - 125, y: (UIScreen.main.bounds.maxY - 15.5) - yPosUpdateButton, width: 36, height: 36))
        button.backgroundColor = .clear
        button.setImage(UIImage(named: "updateN"), for: .normal)
        button.addTarget(self, action: #selector(centralButtonAction), for: .touchUpInside)
        button.isEnabled = false
        return button
    ()
    
    lazy var blur: UIVisualEffectView = 
        let blurEffectView = UIVisualEffectView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height))
        let blurEffect = UIBlurEffect(style: .dark)
        blurEffectView.effect = blurEffect
        blurEffectView.alpha = 0
        
        return blurEffectView
    ()
    
    @objc func centralButtonAction(_ sender: UIButton?) 
        print("Center Tapped")
    
    
    @objc func contextMenuButtonAction(_ sender: UIButton?) 
        print("Context Menu Tapped")
// IF I am past blur effect here and some action for diffent VC nothing happens but each time I'll saw printed text above)
    


这是我创建的菜单图像,但我每次都为每个 VC 编写代码

菜单有...当我按下它时,我会为所有 VC 显示相同的动画并添加一些其他视图但是当我关闭其他子视图时,我希望实现不同的操作,具体取决于 VC 在哪里打开了菜单。

【问题讨论】:

您在问题中遗漏了一些 very 关键细节。例如,您声明您能够做到,但仅限于每个单独的 VC。您是在使用故事板、XIB,还是全部在代码中完成?对您的模糊问题的具体答案很难......所以我会用代码回答我的方式。 (请记住,故事板中没有什么是您无法在代码中完成的。)子类UIViewUIButtons、动作,最后是动画。那时,只需在每个 VC 中实例化这个 UIView 子类...... 现在,如果您需要(并且您可能会这样做),将委托添加到此子类视图 - 这会在此 UIView 子类的 每个 实例和实例化它的特定 VC 视图。其中大部分是您可以找到很好的教程的内容。当您除了特定问题之外几乎可以正常工作时,请返回并给我们代码,以便我们可以复制该问题 - 我们大多数人都会很乐意提供帮助。 这是我创建菜单的示例,但它不起作用gist.github.com/IhorYachmenov/17b4f427b71f2aba11e1fdc962dc188a,我确实创建了这个菜单,只是为所有 VC 复制了代码(,糟糕的方式...... 【参考方案1】:

您是否尝试过将一个控制器作为基础控制器,该控制器可以被所有子控制器继承,并且通用操作/活动成为该控制器的一部分。或者也许为子控制器使用容器视图,以便您可以将基本控制器的属性继承给您的子控制器。这取决于适合您实际要求的内容

【讨论】:

我只是创建了 3 个单独的 VC 并创建了单独的类“BottomMenu”,我在其中创建了“lazy var centerButton: UIButton = ()”之类的视图,然后使用对它的访问 BottomMenu.shared。 centerButton,但是当我按下按钮时,什么也没有发生,但我已经过了“addTarget 方法”中带有模糊效果的动画,我的完整菜单代码gist.github.com/IhorYachmenov/17b4f427b71f2aba11e1fdc962dc188a

以上是关于所有VC的一个UI元素[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

将向量中的所有元素组合成一个新的字符串 MFC VC++

关闭所有导航 ViewController 后将值传递给主 ViewController 并执行操作

在 Swift 中的同一个 VC 上点击按钮后,有没有办法显示以前隐藏在早期代码行中的 UI 元素?

Jquery UI 对话框关闭事件所有可能的方式合二为一

UI 模板视图 - iOs 应用程序上所有场景中的通用 UI 元素?

Xcode 6 Auto Layout - 所有设备的 UI 元素之间的恒定水平间距