PlaceHolder animates when start typing in TextField in iOS

前端 未结 6 1311
忘了有多久
忘了有多久 2021-01-31 05:22

How to set this type of animation in UITextField? Nowadays, Many apps are using this.

6条回答
  •  耶瑟儿~
    2021-01-31 05:35

    For Swift 4.0 and 4.2

    Check this library for floating textField

    https://github.com/hasnine/iOSUtilitiesSource

    Code:

    enum placeholderDirection: String {
        case placeholderUp = "up"
        case placeholderDown = "down"
    
    }
    public class IuFloatingTextFiledPlaceHolder: UITextField {
        var enableMaterialPlaceHolder : Bool = true
        var placeholderAttributes = NSDictionary()
        var lblPlaceHolder = UILabel()
        var defaultFont = UIFont()
        var difference: CGFloat = 22.0
        var directionMaterial = placeholderDirection.placeholderUp
        var isUnderLineAvailabe : Bool = true
        override init(frame: CGRect) {
            super.init(frame: frame)
            Initialize ()
        }
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            Initialize ()
        }
        func Initialize(){
            self.clipsToBounds = false
            self.addTarget(self, action: #selector(IuFloatingTextFiledPlaceHolder.textFieldDidChange), for: .editingChanged)
            self.EnableMaterialPlaceHolder(enableMaterialPlaceHolder: true)
            if isUnderLineAvailabe {
                let underLine = UIImageView()
                underLine.backgroundColor = UIColor.init(red: 197/255.0, green: 197/255.0, blue: 197/255.0, alpha: 0.8)
                //            underLine.frame = CGRectMake(0, self.frame.size.height-1, self.frame.size.width, 1)
                underLine.frame = CGRect(x: 0, y: self.frame.size.height-1, width : self.frame.size.width, height : 1)
    
                underLine.clipsToBounds = true
                self.addSubview(underLine)
            }
            defaultFont = self.font!
    
        }
        @IBInspectable var placeHolderColor: UIColor? = UIColor.lightGray {
            didSet {
                self.attributedPlaceholder = NSAttributedString(string: self.placeholder! as String ,
                                                                attributes:[NSAttributedString.Key.foregroundColor: placeHolderColor!])
            }
        }
        override public var placeholder:String?  {
            didSet {
                //  NSLog("placeholder = \(placeholder)")
            }
            willSet {
                let atts  = [NSAttributedString.Key.foregroundColor.rawValue: UIColor.lightGray, NSAttributedString.Key.font: UIFont.labelFontSize] as! [NSAttributedString.Key : Any]
                self.attributedPlaceholder = NSAttributedString(string: newValue!, attributes:atts)
                self.EnableMaterialPlaceHolder(enableMaterialPlaceHolder: self.enableMaterialPlaceHolder)
            }
    
        }
        override public var attributedText:NSAttributedString?  {
            didSet {
                //  NSLog("text = \(text)")
            }
            willSet {
                if (self.placeholder != nil) && (self.text != "")
                {
                    let string = NSString(string : self.placeholder!)
                    self.placeholderText(string)
                }
    
            }
        }
        @objc func textFieldDidChange(){
            if self.enableMaterialPlaceHolder {
                if (self.text == nil) || (self.text?.count)! > 0 {
                    self.lblPlaceHolder.alpha = 1
                    self.attributedPlaceholder = nil
                    self.lblPlaceHolder.textColor = self.placeHolderColor
                    self.lblPlaceHolder.frame.origin.x = 0 ////\\
                    let fontSize = self.font!.pointSize;
                    self.lblPlaceHolder.font = UIFont.init(name: (self.font?.fontName)!, size: fontSize-3)
                }
                UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 1, options: .curveEaseInOut, animations: {() -> Void in
                    if (self.text == nil) || (self.text?.count)! <= 0 {
                        self.lblPlaceHolder.font = self.defaultFont
                        self.lblPlaceHolder.frame = CGRect(x: self.lblPlaceHolder.frame.origin.x+10, y : 0, width :self.frame.size.width, height : self.frame.size.height)
                    }
                    else {
                        if self.directionMaterial == placeholderDirection.placeholderUp {
                            self.lblPlaceHolder.frame = CGRect(x : self.lblPlaceHolder.frame.origin.x, y : -self.difference, width : self.frame.size.width, height : self.frame.size.height)
                        }else{
                            self.lblPlaceHolder.frame = CGRect(x : self.lblPlaceHolder.frame.origin.x, y : self.difference, width : self.frame.size.width, height : self.frame.size.height)
                        }
    
                    }
                }, completion: {(finished: Bool) -> Void in
                })
            }
        }
        func EnableMaterialPlaceHolder(enableMaterialPlaceHolder: Bool){
            self.enableMaterialPlaceHolder = enableMaterialPlaceHolder
            self.lblPlaceHolder = UILabel()
            self.lblPlaceHolder.frame = CGRect(x: 0, y : 0, width : 0, height :self.frame.size.height)
            self.lblPlaceHolder.font = UIFont.systemFont(ofSize: 10)
            self.lblPlaceHolder.alpha = 0
            self.lblPlaceHolder.clipsToBounds = true
            self.addSubview(self.lblPlaceHolder)
            self.lblPlaceHolder.attributedText = self.attributedPlaceholder
            //self.lblPlaceHolder.sizeToFit()
        }
        func placeholderText(_ placeholder: NSString){
            let atts  = [NSAttributedString.Key.foregroundColor: UIColor.lightGray, NSAttributedString.Key.font: UIFont.labelFontSize] as [NSAttributedString.Key : Any]
            self.attributedPlaceholder = NSAttributedString(string: placeholder as String , attributes:atts)
            self.EnableMaterialPlaceHolder(enableMaterialPlaceHolder: self.enableMaterialPlaceHolder)
        }
        override public func becomeFirstResponder()->(Bool){
            let returnValue = super.becomeFirstResponder()
            return returnValue
        }
        override public func resignFirstResponder()->(Bool){
            let returnValue = super.resignFirstResponder()
            return returnValue
        }
    
        override public func layoutSubviews() {
            super.layoutSubviews()
        }
    }
    

提交回复
热议问题