一个 UI 元素代表所有 VC

One UI element for all VC

如何为所有视图控制器创建带有动画的自定义视图元素,如单独的 class,这样就不用每次都为每个 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 打开菜单的地方。

您是否尝试过将一个控制器作为基础控制器,它可以被所有 child 控制器继承,并且公共 actions/activites 成为该控制器的一部分。或者可以为 child 控制器使用容器视图,以便您可以将基本控制器的属性继承给 child controller.It,具体取决于您的实际需求