Lin*_*rth 133 cocoa-touch uitextfield ios swift
我想在UITextField的开头留一点空间,就像这里一样: 向UITextField添加左边距
但我不知道如何用Swift做到这一点.
Haa*_*nti 253
这就是我现在正在使用的:
Swift 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)
}
}
Run Code Online (Sandbox Code Playgroud)
斯威夫特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)
}
}
Run Code Online (Sandbox Code Playgroud)
斯威夫特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)
}
}
Run Code Online (Sandbox Code Playgroud)
我从来没有设置其他填充,但你可以调整.这个类没有处理文本字段上的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;
}
Run Code Online (Sandbox Code Playgroud)
Phe*_*ter 172
如果使用扩展名,则可以避免对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
}
}
Run Code Online (Sandbox Code Playgroud)
当我需要在我的应用程序中的任何位置设置文本字段的填充时,我只需执行以下操作:
textField.setLeftPaddingPoints(10)
textField.setRightPaddingPoints(10)
Run Code Online (Sandbox Code Playgroud)
使用Swift扩展,不需要子类UITextField
希望这可以帮助!
ak2*_*k2g 67
X,Y,Z是您想要的值
textField.layer.sublayerTransform = CATransform3DMakeTranslation(x, y, z)
Run Code Online (Sandbox Code Playgroud)
onC*_*ion 38
可以通过设置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
Run Code Online (Sandbox Code Playgroud)
我刚刚添加/放置UIView
了文本字段的左侧和右侧.所以现在键入将在视图之后开始.
谢谢
希望这有助于......
Teo*_*aru 31
Swift 4,Xcode 9
我喜欢Pheepster的答案,但我们如何从扩展中完成所有操作,无需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
}
}
}
Run Code Online (Sandbox Code Playgroud)
Fab*_*bio 24
使用我的扩展 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
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何使用
// equal padding
yourTextField.addPadding(padding: .equalSpacing(10))
// padding right
yourTextField.addPadding(padding: .right(10))
// padding left
yourTextField.addPadding(padding: .left(10))
Run Code Online (Sandbox Code Playgroud)
iOS*_*iOS 16
在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
Run Code Online (Sandbox Code Playgroud)
像这样我们也可以创建右侧.(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() {
}
}
Run Code Online (Sandbox Code Playgroud)
现在像这样调用这个函数.
//This single line is enough
SharedClass.sharedInstance.textFieldLeftPadding(textFieldName:yourTF)
Run Code Online (Sandbox Code Playgroud)
liv*_*tay 15
简单的swift 3解决方案 - 向viewDidLoad添加代码:
let indentView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 20))
textField.leftView = indentView
textField.leftViewMode = .always
Run Code Online (Sandbox Code Playgroud)
不需要可笑的长代码
Har*_*kar 10
在Swift 3中为UITextField创建填充视图
func txtPaddingVw(txt:UITextField) {
let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: 5, height: 5))
txt.leftViewMode = .always
txt.leftView = paddingView
}
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,您可以将其视为技术问题,但所有示例都无法区分frame
和bounds
正确。在子视图中引用视图的高度时,请使用bounds
\xe2\x80\x93 ,否则一旦将某些变换应用于父视图,您可能会遇到麻烦。
\n请参阅下面更新的代码(基于 Pheepster 的答案)。
extension UITextField {\n\n func setLeftPadding(_ amount: CGFloat = 10) {\n\n let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.bounds.size.height))\n self.leftView = paddingView\n self.leftViewMode = .always\n }\n\n func setRightPadding(_ amount: CGFloat = 10) {\n\n let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: amount, height: self.bounds.size.height))\n self.rightView = paddingView\n self.rightViewMode = .always\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
小智 7
子类化UITextField是可行的方法.打开游乐场并添加以下代码:
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()
Run Code Online (Sandbox Code Playgroud)
简单的方法:通过扩展 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
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以这样设置任何边缘的填充:
textField.setPadding(left: 5, right: 5)
Run Code Online (Sandbox Code Playgroud)
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)
}
}
Run Code Online (Sandbox Code Playgroud)
参考:升级到Swift 4.2.
编辑:帐户清除按钮.
使用所需的填充空间创建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
Run Code Online (Sandbox Code Playgroud)
我更喜欢使用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))
}
}
Run Code Online (Sandbox Code Playgroud)
这一行代码救了我:
textField.Layer.SublayerTransform = CATransform3D.MakeTranslation(5, 0, 0);
Run Code Online (Sandbox Code Playgroud)
textField.layer.sublayerTransform = CATransform3DMakeTranslation(5, 0, 0);
Run Code Online (Sandbox Code Playgroud)
小智 5
把这段代码放在你的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
Run Code Online (Sandbox Code Playgroud)
这个对我有用 :)
归档时间: |
|
查看次数: |
102309 次 |
最近记录: |