[iOS] UITextField & UITestView

Keyboard Events

隨著Keyboard event調整View的origin.y:

func registerKeyboardNotifications(){
    NotificationCenter.default.addObserver(self, selector: #selector(kyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(UIKeyboardWillHide(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
    
func deregisterKeyboardNotifications(){
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
    
@objc func kyboardWillShow(notification: NSNotification){
     var info = notification.userInfo!
     let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
     
     UIView.animate(withDuration: 0.25) {
        self.view.frame.origin.y = -keyboardSize!.height //Keyboard Height
     }
}
    
@objc func UIKeyboardWillHide(notification: NSNotification){
     UIView.animate(withDuration: 0.25) {
        self.view.frame.origin.y = 0
     }
}

UITextField

return收起鍵盤:

extension Viewcontroller: UITextFieldDelegate {
    public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true 
    }
}

使用IBDesignable 製作一個擁有Left Icon的TextField:

@IBDesignable
class FCUITextField: UITextField {
    
    //left padding for image
    override func leftViewRect(forBounds bounds: CGRect) -> CGRect {
        var textRect = super.leftViewRect(forBounds: bounds)
        textRect.origin.x += leftPadding
        return textRect
    }
    
    @IBInspectable var leftImage: UIImage? {
        didSet {
            updateUI()
        }
    }
    
    @IBInspectable var leftPadding: CGFloat = 0
    
    @IBInspectable var color: UIColor = UIColor.darkGray {
        didSet {
            updateUI()
        }
    }
    
    func updateUI() {
        if let image = leftImage {
            leftViewMode = UITextFieldViewMode.always
            let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
            imageView.contentMode = .scaleAspectFit
            imageView.image = image
            imageView.tintColor = color
            leftView = imageView
        } else {
            leftViewMode = UITextFieldViewMode.never
            leftView = nil
        }
        
        // Placeholder text color
        attributedPlaceholder = NSAttributedString(string: placeholder != nil ?  placeholder! : "", attributes:[NSAttributedStringKey.foregroundColor: color])
    }
}

IDE效果

運行效果

其中color參數為imageView的tintColor, 使用的image需放在xcassets檔中, 必把Render as參數設為

"Template Image" 方能使用

UITestView

Last updated