Эффект размытия — Фон UITextField

Я использую Swift 2 и Xcode 7.

Я хотел бы размыть фон моего UITextField. Я не нашел свойство backgroundView. Только background (для фонового изображения) или backgroundColor.

Я бы пришел, чтобы добавить вид в фоновом режиме. Но я не знаю, как сделать UITextField.

У тебя есть решение ?


person Community    schedule 09.12.2015    source источник


Ответы (4)


Вы можете только добавить какой-то вид, чтобы сделать его размытым. Теперь проблема в том, что у текстовых полей нет свойства backgroundView, но у них есть свойство background, где мы можем установить UIImage. Так что мы можем сделать UIImage из UIView тоже.

Этот метод создаст UIImage для переданного UIView.

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

Теперь мы будем использовать UIBlurEffect и UIVisualEffectView, которые доступны для iOS 8+.

//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)
}

Для 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)
}

Вот прикрепил скриншот

введите здесь описание изображения

Надеюсь это поможет

person Rajan Maheshwari    schedule 09.12.2015

Swift 5, Xcode 10:

Я сделал это, создав подкласс класса 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
    }
}

А затем в вашем 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
}

Вот предварительный просмотр моего подхода:

введите здесь описание изображения

person Kasra Babaei    schedule 27.08.2019

У тебя есть решение?

Вы всегда можете поместить прозрачное текстовое поле поверх другого представления. Если это представление имеет тот же размер, что и текстовое поле, оно будет выглядеть так же, как фоновое представление текстового поля. Вы даже можете сделать текстовое поле подвидом «фонового» представления, чтобы вам было легче перемещать их вместе.

person Caleb    schedule 09.12.2015

Вы можете установить белый цвет фона и изменить его альфа-значение:

myTextField.alpha = 0.5;

Вероятно, не совсем то, что вы просили, но гораздо проще реализовать.

person Alex    schedule 27.06.2016