在 UITextfield 中定位“清除按钮”

Posted

技术标签:

【中文标题】在 UITextfield 中定位“清除按钮”【英文标题】:Position "Clear Button" in UITextfield 【发布时间】:2019-09-04 11:42:37 【问题描述】:

有没有办法定位清除按钮?我想将它向下移动一点,使其与文本输入处于同一水平。有什么想法吗?

我的文本字段已经是另一个处理效果的类的子类。包含“clearButtonRect”功能不起作用。

@IBDesignable open class HoshiTextField: TextFieldEffects 

//effect functions..

    override open func clearButtonRect(forBounds bounds: CGRect) -> CGRect 
        return CGRect(x: 0, y: 0.2, width: 0.1, height: 0.3)
        
    `

【问题讨论】:

你为那个清除按钮使用了什么自定义按钮或使用了文本字段属性? firstNameTextField.clearButtonMode = .whileEditing 这是关于清除按钮的唯一代码 @Chris 你可以试试这个 - ***.com/a/27066764/3683408 找出清除按钮坐标值的简单方法是什么? 【参考方案1】:

子类化您的文本字段并覆盖 clearButtonRect 函数

class CustomTextField: UITextField 

    override func clearButtonRect(forBounds bounds: CGRect) -> CGRect 
        return CGRect(x: xPos, y:yPos, width: yourWidth, height: yourHeight)
    

编辑 1 - 子类 3rd 方文本字段

当您使用第 3 方库调用 TextFieldEffects 时,您需要按照以下步骤操作。

如果您正在使用情节提要并在那里有一个文本字段(将类设置为 CustomTextField)

如果您可以通过编程方式进行操作,则需要在此处进行更改。

然后创建一个新的 swift 文件,命名为 CustomTextField.swift 并添加以下代码

import UIKit
import TextFieldEffects // Import the 3rd party library

// Now you are subclassing the 3rd party textfield
// Change it to the textfield you are using and if you are using multiple create subclass for individual ones.
class CustomTextField: HoshiTextField 

    override func clearButtonRect(forBounds bounds: CGRect) -> CGRect 
        // change the return line as per your requirement. 
        return CGRect(x: 300, y: 25, width: 40, height: 20) 
    

输出

希望这会有所帮助。

【讨论】:

有没有一种简单的方法可以找出 x、y、宽度和高度的值? 我的 Textfields 已经是一个子类,所以我将您的代码复制到其中,但它什么也没做,即使是奇怪的值。 覆盖 open func clearButtonRect(forBounds bounds: CGRect) -> CGRect return CGRect(x: 0, y: 5.0, width: 10, height: 3) @Chris 如果您运行应用程序并按照此Developer Tools for UI Debugging 操作,您将能够找到 x 和 y 位置 如代码中所述,您需要修改您的return CGRect(x: 0, y: 5.0, width: 10, height: 3) 以满足您的需求。再次查看更新的答案,我已更改退货声明并添加了图片。【参考方案2】:

您可以创建自己的自定义文本字段

Chirag 的回答是正确的,但根据 Apple 的说法,您的方法应该调用超级实现并只修改返回的矩形的原点

class CustomTextField : UITextField

    override func clearButtonRect(forBounds bounds: CGRect) -> CGRect
        let rect = super.clearButtonRect(forBounds: bounds)
        return rect.offsetBy(dx: customX, dy: customY)
    

【讨论】:

能否请您添加相关苹果文档的链接? developer.apple.com/documentation/uikit/uitextfield/…【参考方案3】:

基于此处的有用答案... 并回答有关如何自动找到合适的 x/y 位置的评论。这是我对 TextFieldEffects 库中文本字段的通用扩展的解决方案(我使用的是 YoshikoTextField,但该解决方案应该适用于任何带有浮动在字段上方的占位符):

该库中的文本字段有一个占位符 rect,它允许我们获取文本字段上部的高度,这会导致错误的偏移量。

import UIKit
import TextFieldEffects

class CustomYoshikoTextField: YoshikoTextField 

    override func clearButtonRect(forBounds bounds: CGRect) -> CGRect 
        let rect = super.clearButtonRect(forBounds: bounds)
        let placeholderHeight = self.placeholderRect(forBounds: bounds).height
        return rect.offsetBy(dx: 0, dy: placeholderHeight * 0.5)
    

这只是将清除按钮向下移动占位符矩形高度的一半。保证以任何文本字段大小的字段的实际输入部分为中心。

【讨论】:

以上是关于在 UITextfield 中定位“清除按钮”的主要内容,如果未能解决你的问题,请参考以下文章

UITextField在开始编辑时具有“清除”按钮大小

UITextField 的清除按钮在 UITableViewCell 中不起作用

将“清除”按钮添加到 iPhone UITextField

自定义 UITextField 清除按钮

将 UITextfield“清除”默认按钮连接到 UILabel

您可以在自己的自定义控件中重用 UITextField 中的“清除”按钮图形(其中带有“x”的圆圈)吗?