简体   繁体   English

模糊效果-背景UITextField

[英]Blur effect - Background UITextField

I use Swift 2 and Xcode 7. 我使用Swift 2和Xcode 7。

I would like to blur in the background of my UITextField. 我想模糊我的UITextField的背景。 I have not found a property backgroundView . 我还没有找到一个属性backgroundView Only background (for background image) or backgroundColor . background (用于背景图像)或backgroundColor

I would have come to add a view in background. 我本来是要在后台添加视图的。 But I do not know how to make a UITextField. 但是我不知道如何制作一个UITextField。

Do you have a solution ? 你有解决方案吗 ?

You can only add some kind of view to make it a blur view. 您只能添加某种视图以使其成为模糊视图。 Now the problem is that textfields don't have a backgroundView property but they do have a background property where we can set an UIImage . 现在的问题是,文本字段没有backgroundView属性,但它们确实具有background属性,我们可以在其中设置UIImage So we can make a UIImage from a UIView too 所以我们也可以从UIView制作UIImage

This method will create a UIImage for the UIView passed. 此方法将为传递的UIView创建一个UIImage。

func imageWithView(view:UIView)->UIImage{
        UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, 0.0)
        view.layer.renderInContext(UIGraphicsGetCurrentContext()!)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }

Now we will use a UIBlurEffect and UIVisualEffectView which are available for iOS 8+ 现在,我们将使用可用于iOS 8+的UIBlurEffectUIVisualEffectView

//only apply the blur if the user hasn't disabled transparency effects
if !UIAccessibilityIsReduceTransparencyEnabled() {
    let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Light) 
    //you can try for more values like .ExtraLight and .Dark

    let blurEffectView = UIVisualEffectView(effect: blurEffect)
    blurEffectView.frame = textField.bounds
    blurEffectView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
    textField.backgroundColor = UIColor.clearColor()

    //Set the blurred image made from blurred view as textfield's background
    textField.background = imageWithView(blurEffectView)
}

For Swift 3.0 对于Swift 3.0

func imageWithView(view:UIView)->UIImage {
       UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, 0.0)
       view.layer.render(in: UIGraphicsGetCurrentContext()!)
       let image = UIGraphicsGetImageFromCurrentImageContext()
       UIGraphicsEndImageContext()
       return image!
}

if !UIAccessibilityIsReduceTransparencyEnabled() {
    let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.light)
    //you can try for more values like .extraLight and .dark

    let blurEffectView = UIVisualEffectView(effect: blurEffect)
    blurEffectView.frame = textField.bounds
    blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    textField.backgroundColor = UIColor.clear

    //Set the blurred image made from blurred view as textfield's background
    textField.background = imageWithView(view: blurEffectView)
}

Here is the screenshot attached 这是所附的屏幕截图

在此处输入图片说明

Hope this helps 希望这可以帮助

Do you have a solution? 你有解决方案吗?

You can always put a transparent text field on top of another view. 您始终可以将透明文本字段放在另一个视图的顶部 If that view happens to have the same size as the text field, it'll look just like the background view of the text field. 如果该视图恰好具有与文本字段相同的大小,则它看起来就像文本字段的背景视图。 You could even make the text field a subview of the "background" view, so that you can move them around together more easily. 您甚至可以使文本字段成为“背景”视图的子视图,以便您可以更轻松地将它们一起移动。

You can set the background color to white, and change its alpha value: 您可以将背景色设置为白色,并更改其Alpha值:

myTextField.alpha = 0.5;

Probably not exactly what you asked, but much easier to implement. 可能与您的要求不完全相同,但是易于实现。

Swift 5, Xcode 10: Swift 5,Xcode 10:

I did this by subclassing the UIView class, and added a blur effect and a text field to it: 我通过子类化UIView类来做到这一点,并向其中添加了模糊效果和文本字段:

import UIKit

class BlurryTextField: UIView {

    private lazy var blurView: UIVisualEffectView = {
        let blurEffect = UIBlurEffect(style: .light)
        let blurView = UIVisualEffectView(effect: blurEffect)
        blurView.translatesAutoresizingMaskIntoConstraints = false
        blurView.clipsToBounds = true
        blurView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        return blurView
    }()

    lazy var textField: UITextField = {
        let view = UITextField()
        view.translatesAutoresizingMaskIntoConstraints = false
        view.backgroundColor = .clear
        return view
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.layer.cornerRadius = 10
        self.clipsToBounds = true
        self.backgroundColor = .clear
        setupConstraints()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }


    private func setupConstraints() {
        self.addSubview(blurView)
        self.addSubview(textField)

        blurView.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive     = true
        blurView.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive   = true
        blurView.topAnchor.constraint(equalTo: self.topAnchor).isActive             = true
        blurView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive       = true

        textField.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive    = true
        textField.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive  = true
        textField.topAnchor.constraint(equalTo: self.topAnchor).isActive            = true
        textField.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive      = true
    }
}

And then in your UIViewController: 然后在您的UIViewController中:

// Create an instance of BlurryTextField
private lazy var blurryTF: BlurryTextField = {
    let view = BlurryTextField()
    view.translatesAutoresizingMaskIntoConstraints = false
    return view
}()

override func viewDidLoad() {
    super.viewDidLoad()

    // Add the instance to the top of our view
    view.addSubview(blurryTF)
    blurryTF.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    blurryTF.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    blurryTF.heightAnchor.constraint(equalToConstant: 55).isActive = true
}

Here's a preview of my approach: 这是我的方法的预览:

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM