更改 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】:

UITextFieldUITextView 设置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 光标/插入符号颜色的主要内容,如果未能解决你的问题,请参考以下文章

如果在编辑中更改文本更改 UITextField 崩溃

从 ParseUI 更改 UITextField

更改 UITextField 中光标的颜色

UITextField 在编辑时更改字体

UITextView 属性检查器未显示完整的属性集

在 UITextView 编辑时移动 UIView