所有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,还是全部在代码中完成?对您的模糊问题的具体答案很难......所以我会用代码回答我的方式。 (请记住,故事板中没有什么是您无法在代码中完成的。)子类UIView
和UIButtons
、动作,最后是动画。那时,只需在每个 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元素[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
关闭所有导航 ViewController 后将值传递给主 ViewController 并执行操作
在 Swift 中的同一个 VC 上点击按钮后,有没有办法显示以前隐藏在早期代码行中的 UI 元素?