【问题标题】:Create space at the beginning of a UITextField在 UITextField 的开头创建空间
【发布时间】:2016-09-16 14:28:21
【问题描述】:

我想在 UITextField 的开头留一点空间,就像这里: Add lefthand margin to UITextField

但我不知道如何用 Swift 做到这一点。

【问题讨论】:

  • 好吧,你不能在 Objective-C 中子类化 swift 对象,但你可以反过来做......所以我猜你只需调整答案并将其与:@987654322 @
  • 这可能不是最好的解决方案,但您可以制作一个 uiview *paddingView 并执行UITextField.leftView = paddingView。所以给填充视图你想要的宽度。
  • 填充视图只是一个普通的 UIView,它具有您想要的宽度
  • 对于 Swift 5:textField.layoutMargins.left = 20

标签: ios swift cocoa-touch uitextfield


【解决方案1】:

子类化 UITextField 是要走的路。打开一个 Playground 并添加以下代码:

class MyTextField : UITextField {
    var leftTextMargin : CGFloat = 0.0

    override func textRectForBounds(bounds: CGRect) -> CGRect {
        var newBounds = bounds
        newBounds.origin.x += leftTextMargin
        return newBounds
    }

    override func editingRectForBounds(bounds: CGRect) -> CGRect {
        var newBounds = bounds
        newBounds.origin.x += leftTextMargin
        return newBounds
    }
}

let tf = MyTextField(frame: CGRect(x: 0, y: 0, width: 100, height: 44))
tf.text = "HELLO"
tf.leftTextMargin = 25
tf.setNeedsLayout()
tf.layoutIfNeeded()

【讨论】:

  • 这几乎是完美的。你可能有一个占位符,它有一个类似的方法:“placeholderRectForBounds”,你也应该覆盖它,你添加为 x 的内容应该从宽度中减去,否则当文本超出长度时你看不到你的类型领域
  • 如果左边是 25 宽度应该是负 50 以具有相等的填充
【解决方案2】:

这是我现在正在使用的:

斯威夫特 4.2

class TextField: UITextField {

    let padding = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5)

    override open func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: padding)
    }

    override open func placeholderRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: padding)
    }

    override open func editingRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.inset(by: padding)
    }
}

斯威夫特 4

class TextField: UITextField {

    let padding = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5)

    override open func textRect(forBounds bounds: CGRect) -> CGRect {
        return UIEdgeInsetsInsetRect(bounds, padding)
    }

    override open func placeholderRect(forBounds bounds: CGRect) -> CGRect {
        return UIEdgeInsetsInsetRect(bounds, padding)
    }

    override open func editingRect(forBounds bounds: CGRect) -> CGRect {
        return UIEdgeInsetsInsetRect(bounds, padding)
    }
}

斯威夫特 3:

class TextField: UITextField {

    let padding = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5)

    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return UIEdgeInsetsInsetRect(bounds, padding)
    }

    override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
        return UIEdgeInsetsInsetRect(bounds, padding)
    }

    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return UIEdgeInsetsInsetRect(bounds, padding)
    }
}

我从未设置其他填充,但您可以调整。此类不处理文本字段上的 rightView 和 leftView。如果您希望正确处理,您可以使用类似(objc 中的示例,我只需要 rightView:

- (CGRect)textRectForBounds:(CGRect)bounds {
    CGRect paddedRect = UIEdgeInsetsInsetRect(bounds, self.insets);

    if (self.rightViewMode == UITextFieldViewModeAlways || self.rightViewMode == UITextFieldViewModeUnlessEditing) {
        return [self adjustRectWithWidthRightView:paddedRect];
    }
    return paddedRect;
}

- (CGRect)placeholderRectForBounds:(CGRect)bounds {
    CGRect paddedRect = UIEdgeInsetsInsetRect(bounds, self.insets);

    if (self.rightViewMode == UITextFieldViewModeAlways || self.rightViewMode == UITextFieldViewModeUnlessEditing) {
        return [self adjustRectWithWidthRightView:paddedRect];
    }
    return paddedRect;
}

- (CGRect)editingRectForBounds:(CGRect)bounds {
    CGRect paddedRect = UIEdgeInsetsInsetRect(bounds, self.insets);

    if (self.rightViewMode == UITextFieldViewModeAlways || self.rightViewMode == UITextFieldViewModeWhileEditing) {
        return [self adjustRectWithWidthRightView:paddedRect];
    }
    return paddedRect;
}

- (CGRect)adjustRectWithWidthRightView:(CGRect)bounds {
    CGRect paddedRect = bounds;
    paddedRect.size.width -= CGRectGetWidth(self.rightView.frame);

    return paddedRect;
}

【讨论】:

  • 为什么在计算宽度和高度时将顶部和左侧插入加倍?不应该那样做。您应该将两个相关的插图加在一起,然后从原始边界中减去总数。或者只是按顺序减去两者。
  • @Mr.UB 检查当前设备是什么平台,并在此基础上创建不同的填充。 stackoverflow.com/questions/4567728/…。可能是这样的
  • Apple 提供了与newBounds 方法等效的UIEdgeInsetsInsetRect 函数。您可以使用 return UIEdgeInsetsInsetRect(bounds, padding) 代替 return self.newBounds(bounds) 并删除 newBounds 方法。
  • 如果您的文本字段是多行,这会使占位符文本居中并取代 textAlignment = .left 和 contentVerticalAlignment = .top
  • Swift 5: textField.layoutMargins.left = 20
【解决方案3】:

这样的余量可以通过将leftView / rightView 设置为UITextField 来实现。

为 Swift 4 更新

// Create a padding view for padding on left
textField.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 15, height: textField.frame.height))
textField.leftViewMode = .always

// Create a padding view for padding on right
textField.rightView = UIView(frame: CGRect(x: 0, y: 0, width: 15, height: textField.frame.height))
textField.rightViewMode = .always

我刚刚在文本字段的左侧和右侧添加/放置了UIView。所以现在输入将在视图之后开始。

谢谢

希望这会有所帮助...

【讨论】:

  • 如果有人在“目标c”中需要代码,UIView* paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 15, self.userNameTxtFldOutlet.frame.size.height) ];自己。 userNameTxtFldOutlet.leftView = paddingView;自己。 userNameTxtFldOutlet.leftViewMode = UITextFieldViewModeAlways;
  • 这个解决方案比上面提到的子类化要干净得多。应尽可能避免子类化。我建议以下阅读krakendev.io/blog/subclassing-can-suck-and-heres-why
  • 小心,这将阻止显示 clearButton(如果您使用它)
【解决方案4】:

X、Y、Z 是你想要的值

textField.layer.sublayerTransform = CATransform3DMakeTranslation(x, y, z)

【讨论】:

  • 这似乎不适用于 textField.clearButtonMode = UITextFieldViewMode.Always - 清除按钮也向右移动
  • 在需要显示清除按钮时不起作用...清除按钮也被移动。
  • 这个答案很短但不完整,以后可能会出错。 @Adrian你有一个很好的观点,但这不是办法。您必须使用子类来做这件事的原因是针对所有边缘情况。此代码可能会在子类解决方案之前崩溃。但是你是对的,你不应该编写不是严格需要并且可以通过使用给定库提供的代码,但你也不应该滥用标准库
【解决方案5】:

创建具有所需填充空间的 UIView 并将其添加到 textfield.leftView 成员并将 textfield.leftViewMode 成员设置为 UITextFieldViewMode.Always

// For example if you have textfield named title
@IBOutlet weak var title: UITextField!
// Create UIView 
let paddingView : UIView = UIView(frame: CGRectMake(0, 0, 5, 20))
//Change your required space instaed of 5.
title.leftView = paddingView
title.leftViewMode = UITextFieldViewMode.Always

【讨论】:

    【解决方案6】:

    如果您使用扩展,则无需子类化 UITextField,新功能将可用于您应用中的任何 UITextField:

    extension UITextField {
        func setLeftPaddingPoints(_ amount:CGFloat){
            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.frame.size.height))
            self.leftView = paddingView
            self.leftViewMode = .always
        }
        func setRightPaddingPoints(_ amount:CGFloat) {
            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.frame.size.height))
            self.rightView = paddingView
            self.rightViewMode = .always
        }
    }
    

    当我需要在应用程序的任何位置设置文本字段的填充时,我只需执行以下操作:

        textField.setLeftPaddingPoints(10)
        textField.setRightPaddingPoints(10)
    

    使用 Swift 扩展,功能直接添加到 UITextField 中,无需子类化。

    希望这会有所帮助!

    【讨论】:

    • 优秀的解决方案,非常优雅。我所做的唯一更改是将它们添加到一个函数中,因此我得到了类似 textField.setPaddingFor(left: 10, right: 10) 的内容。这两个参数都是可选的,因此如果您传递 nil,则填充将为 0。
    • 太棒了!但是如果你设置 textField.clearButtonMode = .always,你只需要设置左边的填充。右填充会将清除按钮向右移动。
    • 一个观察。它更像是前导/尾随填充。但是,奇怪的是它响应文本字段文本对齐!不是应用语言方向。
    • UILabel中如何设置?
    【解决方案7】:

    ScareCrow 在 Swift 3 中的回答

    let padding = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5);
    
    override func textRect(forBounds bounds: CGRect) -> CGRect {
        return UIEdgeInsetsInsetRect(bounds, padding)
    }
    
    override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
        return UIEdgeInsetsInsetRect(bounds, padding)
    }
    
    override func editingRect(forBounds bounds: CGRect) -> CGRect {
        return UIEdgeInsetsInsetRect(bounds, padding)
    }
    

    【讨论】:

      【解决方案8】:

      简单的 swift 3 解决方案 - 将代码添加到 viewDidLoad:

      let indentView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 20))
      textField.leftView = indentView
      textField.leftViewMode = .always
      

      不需要冗长的代码

      【讨论】:

      • 这不适用于 UISearchBar 内的 UITextField。 :(我需要专门在这种情况下工作的解决方案:(
      • @livtay 当您使用 clearButtonMode 或想要拥有 leftView 等时,这将不起作用。虽然这是一个快速的胜利,但请注意您要进入的洞。
      【解决方案9】:

      在 Swift 3 中。 您可以使用带有在其构造函数中设置的缩进的自定义 UITextField。不需要在控制器中进行额外声明。

      class CustomTextField : UITextField {
      
      private let indentView = UIView(frame: CGRect(x: 0, y:0, width: 10, height: 10))
      
      required init?(coder aDecoder: NSCoder) {
          super.init(coder: aDecoder)
          self.leftView = indentView
          self.leftViewMode = .always 
              }
      }
      

      【讨论】:

        【解决方案10】:

        在 Swift 5 中为 UITextField 创建填充视图

        func txtPaddingVw(txt:UITextField) {
            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: 5, height: 5))
            txt.leftViewMode = .always
            txt.leftView = paddingView
        }
        

        【讨论】:

          【解决方案11】:

          将此代码放入您的viewDidLoad()

          textField.delegate = self
          
          let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: 20, height: self.textField.frame.height))
          textField.leftView = paddingView
          textField.leftViewMode = UITextFieldViewMode.always
          

          它对我有用:)

          【讨论】:

            【解决方案12】:

            Swift 4、Xcode 9

            我喜欢Pheepster's answer,但是我们如何从扩展中完成这一切,而不需要 VC 代码或任何子类化:

            import UIKit
            
            @IBDesignable
            extension UITextField {
            
                @IBInspectable var paddingLeftCustom: CGFloat {
                    get {
                        return leftView!.frame.size.width
                    }
                    set {
                        let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height))
                        leftView = paddingView
                        leftViewMode = .always
                    }
                }
            
                @IBInspectable var paddingRightCustom: CGFloat {
                    get {
                        return rightView!.frame.size.width
                    }
                    set {
                        let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height))
                        rightView = paddingView
                        rightViewMode = .always     
                    }
                }
            }
            

            【讨论】:

            • 这样做会更安全rightView?.frame.size.width ?? 0
            • 可能。我,就我自己而言,永远不会调用 getter,所以它不会打扰我。
            • 伙计们,我将方法的名称从 paddingLeft 修改为 paddingLeftCustom 和另一个。如果我没有这样做,那么当您使用确实具有 UITextView(如 UISearchBar)的视图时,会出现两周后出现的错误。只是...不要设置默认名称。
            【解决方案13】:

            简单的方法:通过扩展 UITextField 来做到这一点

            extension UITextField {
            
               func setPadding(left: CGFloat? = nil, right: CGFloat? = nil){
                   if let left = left {
                      let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: left, height: self.frame.size.height))
                      self.leftView = paddingView
                      self.leftViewMode = .always
                   }
            
                   if let right = right {
                       let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: right, height: self.frame.size.height))
                       self.rightView = paddingView
                       self.rightViewMode = .always
                   }
               }
            
            }
            

            然后您可以通过这种方式将填充设置到任何边缘:

            textField.setPadding(left: 5, right: 5)
            

            【讨论】:

            • 尝试相同的代码,但在 iOS 13 上使用彩色 -left- 和 -right- 视图并使用 xCode 11 构建它 ....)) 你会惊讶于 textView 如何改变它insets 和 hot 它将视图移向边缘,因此添加的视图不完全可见
            【解决方案14】:

            Swift 4.2 和 Xcode 10

            最初我的文本字段是这样的。

            在左侧添加填充后,我的文本字段是...

            //Code for left padding 
            textFieldName.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: textFieldName.frame.height))
            textFieldName.leftViewMode = .always
            

            这样我们也可以创建右侧。(textFieldName.rightViewMode = .always)

            如果你想要 SharedInstance 类型的代码(每件都写一次)请看下面的代码。

            //This is my shared class
            import UIKit
            class SharedClass: NSObject {
                static let sharedInstance = SharedClass()
            
                //This is my padding function.
                func textFieldLeftPadding(textFieldName: UITextField) {
                // Create a padding view
                textFieldName.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 3, height: textFieldName.frame.height))
                textFieldName.leftViewMode = .always//For left side padding
                textFieldName.rightViewMode = .always//For right side padding
                }
            
                private override init() {
            
                }
            }
            

            现在像这样调用这个函数。

            //This single line is enough
            SharedClass.sharedInstance.textFieldLeftPadding(textFieldName:yourTF)
            

            【讨论】:

            • 不应该扩展工作更好,而不是为这样一个小任务引入一个共享类吗?
            • @Sharkes Monken,我不明白
            • @Sharkes Monken,你能帮我解释一下吗?谢谢。
            • 我认为这意味着函数的扩展 UITextField,这个助手函数的单例不好
            【解决方案15】:

            这里是Haagenti's answer 更新到 Swift 4.2:

            class PaddedTextField: UITextField {
            
                func getPadding(plusExtraFor clearButtonMode: ViewMode) -> UIEdgeInsets {
                    var padding = UIEdgeInsets(top: 11, left: 16, bottom: 11, right: 16)
            
                    // Add additional padding on the right side when showing the clear button
                    if self.clearButtonMode == .always || self.clearButtonMode == clearButtonMode {
                        padding.right = 28
                    }
            
                    return padding
                }
            
                override open func textRect(forBounds bounds: CGRect) -> CGRect {
                    let padding = getPadding(plusExtraFor: .unlessEditing)
                    return bounds.inset(by: padding)
                }
            
                override open func placeholderRect(forBounds bounds: CGRect) -> CGRect {
                    let padding = getPadding(plusExtraFor: .unlessEditing)
                    return bounds.inset(by: padding)
                }
            
                override open func editingRect(forBounds bounds: CGRect) -> CGRect {
                    let padding = getPadding(plusExtraFor: .whileEditing)
                    return bounds.inset(by: padding)
                }
            
            }
            

            参考:Upgrading To Swift 4.2

            编辑:帐户清除按钮。

            【讨论】:

              【解决方案16】:

              我更喜欢使用 IBDesignable 类和 IBInspectable 属性来允许我通过 Xcode 故事板设置填充并使其可重用。我还更新了代码以在 Swift 4 中工作。

              import Foundation
              import UIKit
              
              @IBDesignable
              class PaddableTextField: UITextField {
              
                  var padding = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 0.0)
              
                  @IBInspectable var left: CGFloat = 0 {
                      didSet {
                          adjustPadding()
                      }
                  }
              
                  @IBInspectable var right: CGFloat = 0 {
                      didSet {
                          adjustPadding()
                      }
                  }
              
                  @IBInspectable var top: CGFloat = 0 {
                      didSet {
                          adjustPadding()
                      }
                  }
              
                  @IBInspectable var bottom: CGFloat = 0 {
                      didSet {
                          adjustPadding()
                      }
                  }
              
                  func adjustPadding() {
                       padding = UIEdgeInsets(top: top, left: left, bottom: bottom, right: right)
              
                  }
              
                  override func prepareForInterfaceBuilder() {
                      super.prepareForInterfaceBuilder()
                  }
              
                  override func textRect(forBounds bounds: CGRect) -> CGRect {
                      return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
                  }
              
                  override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
                      return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
                  }
              
                  override func editingRect(forBounds bounds: CGRect) -> CGRect {
                       return bounds.inset(by: UIEdgeInsets(top: top, left: left, bottom: bottom, right: right))
                  }
              }
              

              【讨论】:

                【解决方案17】:

                * 在 Swift 5 中扩展 UITextField *

                import UIKit
                
                @IBDesignable
                extension UITextField {
                
                    @IBInspectable var paddingLeftCustom: CGFloat {
                        get {
                            return leftView!.frame.size.width
                        }
                        set {
                            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height))
                            leftView = paddingView
                            leftViewMode = .always
                        }
                    }
                
                    @IBInspectable var paddingRightCustom: CGFloat {
                        get {
                            return rightView!.frame.size.width
                        }
                        set {
                            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: newValue, height: frame.size.height))
                            rightView = paddingView
                            rightViewMode = .always
                        }
                    }
                
                }
                

                【讨论】:

                  【解决方案18】:

                  这一行代码救了我:

                  对于 Xamarin.iOS:

                  textField.Layer.SublayerTransform = CATransform3D.MakeTranslation(5, 0, 0);
                  

                  对于斯威夫特:

                  textField.layer.sublayerTransform = CATransform3DMakeTranslation(5, 0, 0);
                  

                  【讨论】:

                    【解决方案19】:
                    //MARK:-  Use this class for different type of Roles
                    
                    import UIKit
                    
                    class HelperExtensionViewController: UIViewController {
                    
                    }
                    
                    //MARK:- Extension
                    
                    extension UIImageView
                    {
                        func setImageCornerRadius()
                        {
                            self.layer.cornerRadius = self.frame.size.height/2
                            self.clipsToBounds = true
                        }
                    
                        func setImageCornerRadiusInPoints(getValue:CGFloat)
                        {
                            self.layer.cornerRadius = getValue
                            self.clipsToBounds = true
                        }
                    }
                    
                    extension UIButton
                    {
                        func setButtonCornerRadiusOnly()
                        {
                            self.layer.cornerRadius = self.frame.size.height/2
                            self.clipsToBounds = true
                        }
                    
                        func setBtnCornerRadiusInPoints(getValue:CGFloat)
                        {
                            self.layer.cornerRadius = getValue
                            self.clipsToBounds = true
                        }
                    
                    
                    }
                    
                    extension UITextField
                    {
                        func setTextFieldCornerRadiusWithBorder()
                        {
                            self.layer.cornerRadius = self.frame.size.height/2
                            self.layer.borderColor = UIColor.darkGray.cgColor
                            self.backgroundColor = UIColor.clear
                            self.layer.borderWidth = 0.5
                            self.clipsToBounds = true
                        }
                    
                        func setLeftPaddingPoints(_ amount:CGFloat){
                            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.frame.size.height))
                            self.leftView = paddingView
                            self.leftViewMode = .always
                        }
                        func setRightPaddingPoints(_ amount:CGFloat) {
                            let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.frame.size.height))
                            self.rightView = paddingView
                            self.rightViewMode = .always
                        }
                    }
                    
                    
                    
                    extension UIView
                    {
                    
                        func setCornerRadius()
                        {
                            self.layer.cornerRadius = self.frame.size.height/2
                            self.clipsToBounds = true
                        }
                    
                        // OUTPUT 1
                        func setViewCornerRadiusWithBorder()
                        {
                            self.layer.cornerRadius = self.frame.size.height/2
                            self.layer.borderColor = UIColor.init(red: 95.0/255.0, green: 229.0/255.0, blue: 206.0/255.0, alpha: 1.0).cgColor
                            self.backgroundColor = UIColor.clear
                            self.layer.borderWidth = 1.0
                            self.clipsToBounds = true
                        }
                    
                        func layoutSubviews(myView:UIView)
                        {
                            let shadowPath = UIBezierPath(rect: myView.bounds)
                            myView.layer.masksToBounds = false
                            myView.layer.shadowColor = UIColor.lightGray.cgColor
                            myView.layer.shadowOffset = CGSize(width: -1.0, height: 2.0)
                            myView.layer.shadowOpacity = 0.5
                            myView.layer.shadowPath = shadowPath.cgPath
                        }
                    
                        func layoutSubviews2(myView:UIView)
                        {
                            let shadowPath = UIBezierPath(rect: myView.bounds)
                            myView.clipsToBounds = true
                            myView.layer.masksToBounds = false
                            myView.layer.shadowColor = UIColor.black.cgColor
                            myView.layer.shadowOffset = CGSize(width: 0.0, height: 1.0)
                            myView.layer.shadowOpacity = 0.2
                            myView.layer.shadowPath = shadowPath.cgPath
                    
                        }
                    
                        func setViewCornerRadiusInPoints(getValue:CGFloat)
                        {
                            self.layer.cornerRadius = getValue
                            self.clipsToBounds = true
                        }
                    
                    
                        func dropShadow(scale: Bool = true) {
                            layer.masksToBounds = false
                            layer.shadowColor = UIColor.black.cgColor
                            layer.shadowOpacity = 0.5
                            layer.shadowOffset = CGSize(width: -1, height: 1)
                            layer.shadowRadius = 1
                    
                            layer.shadowPath = UIBezierPath(rect: bounds).cgPath
                            layer.shouldRasterize = true
                            layer.rasterizationScale = scale ? UIScreen.main.scale : 1
                        }
                    
                        // OUTPUT 2
                        func dropShadow(color: UIColor, opacity: Float = 0.5, offSet: CGSize, radius: CGFloat = 1, scale: Bool = true) {
                            layer.masksToBounds = false
                            layer.shadowColor = color.cgColor
                            layer.shadowOpacity = opacity
                            layer.shadowOffset = offSet
                            layer.shadowRadius = radius
                    
                            layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
                            layer.shouldRasterize = true
                            layer.rasterizationScale = scale ? UIScreen.main.scale : 1
                        }
                    
                        func setGradientBackground(myview:UIView) {
                            let colorTop =  UIColor(red: 100.0/255.0, green: 227.0/255.0, blue: 237.0/255.0, alpha: 1.0).cgColor
                            let colorBottom = UIColor(red: 141.0/255.0, green: 109.0/255.0, blue: 164.0/255.0, alpha: 1.0).cgColor
                    
                            let gradientLayer = CAGradientLayer()
                            gradientLayer.colors = [colorTop, colorBottom]
                            gradientLayer.locations = [1.0, 1.0]
                            gradientLayer.frame = myview.bounds
                    
                            myview.layer.insertSublayer(gradientLayer, at:0)
                        }
                    }
                    

                    【讨论】:

                      【解决方案20】:

                      使用我的扩展 Swift 5 测试:

                      extension UITextField {
                      
                      enum PaddingSpace {
                          case left(CGFloat)
                          case right(CGFloat)
                          case equalSpacing(CGFloat)
                      }
                      
                      func addPadding(padding: PaddingSpace) {
                      
                          self.leftViewMode = .always
                          self.layer.masksToBounds = true
                      
                          switch padding {
                      
                          case .left(let spacing):
                              let leftPaddingView = UIView(frame: CGRect(x: 0, y: 0, width: spacing, height: self.frame.height))
                              self.leftView = leftPaddingView
                              self.leftViewMode = .always
                      
                          case .right(let spacing):
                              let rightPaddingView = UIView(frame: CGRect(x: 0, y: 0, width: spacing, height: self.frame.height))
                              self.rightView = rightPaddingView
                              self.rightViewMode = .always
                      
                          case .equalSpacing(let spacing):
                              let equalPaddingView = UIView(frame: CGRect(x: 0, y: 0, width: spacing, height: self.frame.height))
                              // left
                              self.leftView = equalPaddingView
                              self.leftViewMode = .always
                              // right
                              self.rightView = equalPaddingView
                              self.rightViewMode = .always
                          }
                      }
                      }
                      

                      如何使用

                      // equal padding
                      yourTextField.addPadding(padding: .equalSpacing(10)) 
                      
                      // padding right 
                      yourTextField.addPadding(padding: .right(10))
                      
                      // padding left
                      yourTextField.addPadding(padding: .left(10)) 
                      

                      【讨论】:

                      • @JoséRaúlToledanoR THX :)
                      • 优雅。谢谢。
                      • @Carlo Grazie mille Carlo :)
                      • 这是最好的解决方案。
                      【解决方案21】:

                      扩展 leftView 和 Swift5+ 的原始答案

                      class TextField: UITextField {
                      
                      let padding = UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5)
                      override open func textRect(forBounds bounds: CGRect) -> CGRect {
                          let paddedRect = bounds.inset(by: self.padding)
                          if (self.leftViewMode == .always || self.leftViewMode == .unlessEditing) {
                              return self.adjustRectOriginForLeftView(bounds: paddedRect)
                          }
                          return paddedRect
                      }
                      override open func placeholderRect(forBounds bounds: CGRect) -> CGRect {
                          let paddedRect = bounds.inset(by: self.padding)
                          if (self.leftViewMode == .always || self.leftViewMode == .unlessEditing) {
                              return self.adjustRectOriginForLeftView(bounds: paddedRect)
                          }
                          return paddedRect;
                      }
                      override open func editingRect(forBounds bounds: CGRect) -> CGRect {
                          let paddedRect = bounds.inset(by: self.padding);
                          if (self.leftViewMode == .always || self.leftViewMode == .unlessEditing) {
                              return self.adjustRectOriginForLeftView(bounds: paddedRect)
                          }
                          return paddedRect;
                      }
                      
                      func adjustRectOriginForLeftView(bounds : CGRect) -> CGRect{
                          var paddedRect = bounds;
                          paddedRect.origin.x += self.leftView!.frame.width
                          return paddedRect
                          
                      }
                      

                      }

                      【讨论】:

                        【解决方案22】:

                        在 UITextField 的开头创建空格。
                        Swift 5+Xcode 12 中。

                        textFieldName.setLeftPaddingPoints(CGFloat(10))  
                        textFieldName.setRightPaddingPoints(CGFloat(10)
                        

                        【讨论】:

                        • 这个不存在。我认为您正在使用下面提到的扩展来实现这一点。
                        【解决方案23】:

                        在大多数情况下,您可以将其视为技术性问题,但所有示例都无法区分 framebounds 之间的区别。在子视图中引用视图的高度时,请使用 bounds - 否则一旦将某些变换应用于父视图,您可能会遇到麻烦。
                        请参阅下面的更新代码(基于 Pheepster 的回答)。

                        extension UITextField {
                        
                            func setLeftPadding(_ amount: CGFloat = 10) {
                        
                                let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.bounds.size.height))
                                self.leftView = paddingView
                                self.leftViewMode = .always
                            }
                        
                            func setRightPadding(_ amount: CGFloat = 10) {
                        
                                let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.bounds.size.height))
                                self.rightView = paddingView
                                self.rightViewMode = .always
                            }
                        }
                        

                        【讨论】:

                          猜你喜欢
                          • 2013-06-13
                          • 1970-01-01
                          • 1970-01-01
                          • 2017-07-12
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多