我在不同的视图控制器类中有相同的方法,基本上它为视图控制器添加了模糊效果。现在我正在尝试使用其他swift类型来简化我的代码,但我很困惑如何实现这一点,以便添加子视图正常工作。处理此类案件的方法是什么?扩展,协议,结构,类或其他功能?
这是一个视图控制器(这里简化):
import UIKit
class MyClass: UIViewController {
weak var blurEffectView : UIVisualEffectView?
.... other methods ....
func addBlurrEffect() {
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
let blurEffectVw = UIVisualEffectView(effect: blurEffect)
blurEffectVw.frame = self.view.bounds
blurEffectVw.autoresizingMask = [.flexibleWidth, .flexibleHeight] // for supporting device rotation
self.view.addSubview(blurEffectVw)
blurEffectView = blurEffectVw
}
... other methods ....
}
我有其他类似的视图控制器。如何重构它们只在整个项目中使用addBlurEffect()一次?
答案 0 :(得分:2)
在项目中为blur函数创建NSObject类,并在那里添加方法。
要调用方法,首先在VC中创建该模型类的对象,然后像这样使用obj.addBlur()。
注意:如果你需要来自vc的任何变量,那么将该变量作为addBlur函数的参数发送。
示例:addBlur(self.Viewblur)
答案 1 :(得分:1)
您可以使用子类化。
创建一个类,它是 UIViewController 的子类,如下所示:
class CustomViewController: UIViewController {
weak var blurEffectView : UIVisualEffectView?
func addBlurrEffect() {
//layout for the pool of clnts that can be selected to add files
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
let blurEffectVw = UIVisualEffectView(effect: blurEffect)
blurEffectVw.frame = self.view.bounds
blurEffectVw.autoresizingMask = [.flexibleWidth, .flexibleHeight] // for supporting device rotation
self.view.addSubview(blurEffectVw)
blurEffectView = blurEffectVw
}
}
然后,您可以将此类用于所有View控制器并访问addBlurrEffect
函数,如下所示:
class ViewControllerOne: CustomViewController {
override func viewDidLoad() {
super.viewDidLoad()
addBlurrEffect()
}
}
class ViewControllerTwo: CustomViewController {
override func viewDidLoad() {
super.viewDidLoad()
addBlurrEffect()
}
}
答案 2 :(得分:1)
在协议中声明此行为:
protocol Blurrable {
var view: UIView { get set }
var blurEffectView: UIVisualEffectView? { get set }
func addBlurrEffect()
}
在该协议的扩展中定义行为:
extension Blurrable {
func addBlurrEffect()
//layout for the pool of clnts that can be selected to add files
let blurEffect = UIBlurEffect(style: .dark)
blurEffectView = UIVisualEffectView(effect: blurEffect)
blurEffectView.frame = self.view.bounds
blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight] // for supporting device rotation
self.view.addSubview(blurEffectView)
}
}
并将此协议的一致性添加到所有相关的ViewControllers:
class MyVC1: UIViewController, Blurrable {
weak var blurEffectView : UIVisualEffectView?
// ...
}
class MyVC2: UIViewController, Blurrable {
weak var blurEffectView : UIVisualEffectView?
// ...
}
答案 3 :(得分:1)
您应该创建为UIViewController添加扩展名:
__len__
请注意,您无法在扩展中添加实例变量。您应该重构函数以返回生成的模糊效果视图,而不是依赖于实例变量。
答案 4 :(得分:0)
这样的东西会起作用。您也可以使用@IBInspectable。
import UIKit
extension UIView {
weak var blurEffectView : UIVisualEffectView?
.... other methods ....
func addBlurrEffect() {
//layout for the pool of clnts that can be selected to add files
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
let blurEffectVw = UIVisualEffectView(effect: blurEffect)
blurEffectVw.frame = self.view.bounds
blurEffectVw.autoresizingMask = [.flexibleWidth, .flexibleHeight] // for supporting device rotation
self.view.addSubview(blurEffectVw)
blurEffectView = blurEffectVw
}
... other methods ....
}
}
答案 5 :(得分:0)
你可以像这样做第二节课
class BlurManager {
weak var blurEffectView: UIVisualEffectView?
weak var viewController: UIViewController
var isBlurred:Bool = false
init(viewController:UIViewController){
self.viewController = viewController
}
func addBlurEffect() {
if !isBlurred {
isBlurred = true
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.dark)
let blurEffectVw = UIVisualEffectView(effect: blurEffect)
blurEffectVw.frame = self.view.bounds
blurEffectVw.autoresizingMask = [.flexibleWidth, .flexibleHeight] // for supporting device rotation
viewController.view.addSubview(blurEffectVw)
blurEffectView = blurEffectVw
}
}
func removeBlurEffect() {
if isBlurred {
isBlurred = false
...cleanup...
}
}
}
class MyClass: UIViewController {
lazy var blurManager: BlurManager = {
return BlurManager(viewController:self)
}()
.... other methods ....
blueManager.addBlurEffect()
... other methods ....
}