更改 UITextField 和 UITextView 光标/插入符号颜色
Posted
技术标签:
【中文标题】更改 UITextField 和 UITextView 光标/插入符号颜色【英文标题】:Change UITextField and UITextView Cursor / Caret Color 【发布时间】:2012-07-21 07:17:24 【问题描述】:我想知道如何在 ios 中更改 UITextField
(如果答案相同,则 UITextView
)中的光标/插入符号的颜色。我已经看到了 OSX 开发的答案,但没有看到 iOS 开发的答案。
这可能吗?
【问题讨论】:
UITextField
的详细答案,包括如何在 Interface Builder 中执行此操作,***.com/a/18759577/1709587
简单而完整的答案***.com/a/18945907/1292230 ;)
【参考方案1】:
如果您的目标是 iOS 7+,这会变得容易得多。只需使用外观代理使用光标更改字段的tintColor
,它将应用于整个应用程序:
斯威夫特 3.0:
UITextField.appearance().tintColor = .black
目标-C:
[[UITextField appearance] setTintColor:[UIColor blackColor]];
同样的答案适用于个人UITextField
:
斯威夫特 3.0:
myTextField.tintColor = .black
目标-C
[myTextField setTintColor:[UIColor blackColor]];
【讨论】:
我发现这会导致我的 UIBarButton 项目色调颜色固定为默认值,即使我将色调颜色设置为完全不同的颜色。我通过在创建 UITextFields 时单独设置它们的色调来解决问题。 这行得通,但前提是你在 didFinishLaunching 中这样做?或者你可以根据用户交互来做吗,例如按下按钮? @SteffenAndersen 它的行为应该符合 UIAppearance 代理 API 文档。 [[UITextView 外观] setTintColor:teal];由于某种原因,这改变了我的导航栏按钮的颜色,你是如何单独设置的? 在 Swift 3.0 上使用这个: UITextField.appearance().tintColor = UIColor.black【参考方案2】:在 iOS7 中你可以简单地改变 textField 的 tintColor
【讨论】:
【参考方案3】:斯威夫特 3:
UITextField.appearance().tintColor = UIColor.black
UITextView.appearance().tintColor = UIColor.black
【讨论】:
在 Swift 3.0 上使用这个: UITextField.appearance().tintColor = UIColor.black【参考方案4】:yourTextField.tintColor = [UIColor whiteColor];
如果你在代码中设置它就可以工作,'因为不知何故颜色触发器在 Interface Builder 中不会这样做(Xcode 6.1.1)。它非常适合,无需更改任何外观代理。
【讨论】:
由于某种未知原因,它不适用于 whiteColor,但适用于所有其他颜色(在 iOS 8 上测试)。我必须设置几乎是白色但不是白色的颜色才能使它起作用。 @LeszekSzary 嘿!你救了我的一天!我尝试了将近 4 个小时,而你的话就是线索!苹果应该修复这个确实让开发者发疯的疯狂错误。【参考方案5】:注意:此答案已过时,应仅用于 iOS 7 之前的开发。在 iOS 7 中查看使用外观代理的 1 行解决方案的其他答案。
在我正在从事的项目中遇到同样的问题后,我提出了这个问题。
我设法创建了一个将被 AppStore 审核团队接受的解决方案,因为它不使用任何现有的私有 API。
我创建了一个名为 DGTextField 的控件,它扩展了 UITextField。
【讨论】:
这很棒。老实说,正因为如此,我肯定会密切关注文档中的“符合”。但是,我很高兴只有一个人不得不花时间阅读和修补它。希望其他人能够看到并使用它! 但是,我可能会推荐动画选项,删除 @propery 并仅创建 setter 和 getter 以及自定义插入符号宽度的 setter 和 getter。你可能不感兴趣,但我总是喜欢这些小调整! @RileyE 很高兴您能够从我的解决方案中受益。随意分叉回购并添加您想分享的任何调整。 在 iOS 7 中要容易得多 - 请参阅下面的答案:***.com/a/18945907/1103584【参考方案6】:为UITextField
和UITextView
设置tintColor
的工作方式不同。
对于UITextField
,您不需要在更新tintColor
后调用其他代码来更改光标颜色,但对于UITextView
,您需要。
所以在为UITextView
设置tintColor
之后(在IB 或代码中都没有关系)你需要调用textView.tintColorDidChange()
来应用它(实际上它会将文本视图的配置传递到它的子视图层次结构)。
【讨论】:
【参考方案7】:这对我很有效:
UITextField.tintColor = UIColor.blackColor()
您也可以在情节提要中设置:https://***.com/a/18759577/3075340
【讨论】:
这不起作用。我得到了错误:Instance member 'tintcolor' cannot be used on type 'UITextField'
@pableiros 以上是 Swift 2。也许你现在正在使用 Swift 3?
我在 Swift 3 和 Swift 2.3 上试过,我不确定在 Swift 2.2 和更低版本上是否可以工作
pableiros 的问题是答案应该是someTextFieldInstance
而不是UITextField
,因为tintColor
是实例成员【参考方案8】:
更通用的方法是设置 UIView 的外观 tintColor。
UIColor *myColor = [UIColor purpleColor];
[[UIView appearance] setTintColor:myColor];
如果您使用许多默认 UI 元素,这很有意义。
【讨论】:
嗯...这有许多其他副作用...问题只是询问更改插入符号颜色,而您的答案将着色应用程序中的每个 UIView...这个可能不是大多数人想要采取的方法。 +1,如果目标只是改变插入符号的颜色,副作用太多。当您为容器设置样式时,设置 UIView tintColor 很有用(但我不会使用[UIView appearance]
【参考方案9】:
试试吧,它对我有用。
[[self.textField valueForKey:@"textInputTraits"] setValue:[UIColor redColor] strong textforKey:@"insertionPointColor"];
【讨论】:
这是使用私有方法,但感谢您的建议。这很容易导致申请被拒绝。【参考方案10】:只有通过访问私有属性才有可能,因此可能会导致 Apple AppStore 应用被拒绝。
take a look at this *** question
【讨论】:
【参考方案11】:我想如果你想要一些自定义颜色,你可以去Assets.xcassets
文件夹,右键单击并选择New Color Set
,一旦你创建了你设置的颜色,给它一个名称以重复使用它。
你可以像这样使用它:
import UIKit
class ViewController: UIViewController
override func viewDidLoad()
super.viewDidLoad()
UITextField.appearance().tintColor = UIColor(named: "YOUR-COLOR-NAME") #here
在 macOS 10.15 / iOS 13 / Swift 5 上测试
【讨论】:
【参考方案12】:对于在 SwiftUI 中搜索 Textfield
的等价物的人,这是 accentColor
:
TextField("Label", text: $self.textToBind).accentColor(Color.red)
【讨论】:
【参考方案13】:Durgesh 的方法确实有效。
我也多次使用过这样的KVC方案。 尽管它似乎没有记录,但它确实有效。坦率地说,你不使用任何 这里的私有方法——只有合法的键值编码。
附:昨天我的新应用程序出现在 AppStore 上,这种方法没有任何问题。当我使用 KVC 更改一些只读属性(如 navigatonBar)或私有 ivars 时,这不是第一种情况。
【讨论】:
它没有使用私有方法,而是密钥没有记录,这意味着它们不能用于 App Store 上的应用程序。您的申请可能会被主观拒绝。您一定有一位善良的审稿人,因为许多人因使用该方法而被拒绝。 然后我有大约 10 位善良的审稿人 :) 和我的许多同事。 澄清一下,本例中的“键值编码”是使用便捷方法为属性赋值。我们之所以使用它,而不是 setter,是因为该属性是不可访问/隐藏/私有的。 这里我的意思是(也许我不知道一些重要的事情)只是关于 KVC 的文档并不意味着任何字面上的限制。所以我成功地使用了所有这些。希望其他人也可以。 赞赏。但是,Apple 在其“使用条款协议”中声明,我们可以使用和公开讨论其文档中包含的任何内容,并禁止使用未记录的方法(将包括通过 KVC 访问“textInputTraits”设置方法,因为财产是无证的)。本质上,如果您在文档中找不到该方法,则它是被禁止的。但是,禁止并不能保证拒绝。我有一些应用程序被拒绝,原因包括我的一些应用程序进入商店。未记录的方法屡见不鲜。【参考方案14】:对于带有 Swift 的 Interface Builder 版本
@IBOutlet weak var tvValue: UITextView!
didSet
tvValue.tintColor = .black
【讨论】:
【参考方案15】:如果UITextField
来自UISearchBar
,则首先从searchBar
获取textField
,然后应用tintColor
属性:
let textFieldInsideSearchBar = searchBar.value(forKey: "searchField") as? UITextField
textFieldInsideSearchBar?.tintColor = UIColor.lightGray
【讨论】:
【参考方案16】:斯威夫特 4
在 viewDidLoad() 中只需调用以下代码:
代码示例
//txtVComplaint is a textView
txtVComplaint.tintColor = UIColor.white
txtVComplaint.tintColorDidChange()
【讨论】:
以上是关于更改 UITextField 和 UITextView 光标/插入符号颜色的主要内容,如果未能解决你的问题,请参考以下文章