美文网首页
SwiftUI 包装UIView类型

SwiftUI 包装UIView类型

作者: csr_yang | 来源:发表于2020-04-12 18:29 被阅读0次

    在SwiftUI中,有时候我们需要利用一些SwiftUI中不存在但是UIKit已有的View的时候,可以考虑使用包装已有的UIView类型,然后提供给SwiftUI使用。
    例如,在SwiftUI中为View添加半透明的模糊效果。

    SwiftUI中UIViewRepresentable协议提供了封装UIView的功能。这个协议要求我们实现两个方法:

    protocol UIViewRepresentable : View
        associatedtype UIViewType : UIView
        func makeUIView(context: Self.Context) !" Self.UIViewType
        func updateUIView(
            _ uiView: Self.UIViewType,
            context: Self.Context
        )
    }
    

    makeUIView(context:) 需要返回想要封装的 UIView 类型,SwiftUI 在创建一个被封 装的 UIView 时会对其调用。updateUIView(_:context:) 则在 UIViewRepresentable 中的某个属性发生变化,SwiftUI 要求更新该 UIKit 部件时被调用

    创建一个BlurView

    struct BlurView: UIViewRepresentable {
    
        let style: UIBlurEffect.Style
    
        func makeUIView(context: UIViewRepresentableContext<BlurView>) -> UIView {
            let view = UIView(frame: .zero)
            view.backgroundColor = .clear
    
            let blurEffect = UIBlurEffect(style: style)
            let blurView = UIVisualEffectView(effect: blurEffect)
    
            blurView.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview(blurView)
            NSLayoutConstraint.activate([
                blurView.heightAnchor.constraint(equalTo: view.heightAnchor),
                blurView.widthAnchor.constraint(equalTo: view.widthAnchor)
            ])
            return view
        }
    
        func updateUIView(
            _ uiView: UIView,
            context: UIViewRepresentableContext<BlurView>)
        {
        }
    }
    
    extension View {
        func blurBackground(style: UIBlurEffect.Style) -> some View {
            ZStack {
                BlurView(style: style)
                self
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:SwiftUI 包装UIView类型

          本文链接:https://www.haomeiwen.com/subject/iirsmhtx.html