更改UITextField和UITextView光标/插入符号的颜色


222

我想知道如何在iOS中UITextFieldUITextView如果答案相同)更改光标/插入符号的颜色。我已经看到了OSX开发的答案,但没有看到iOS的答案。

这有可能吗?


1
有关stackoverflow.com/a/18759577/1709587的详细答案UITextField(包括如何在Interface Builder中执行此操作),请
参阅马克阿默里

1
简单和完整的答案stackoverflow.com/a/18945907/1292230 ;)
RileyE

Answers:


511

如果您的目标是iOS 7+,则此操作会变得更加容易。只需tintColor使用外观代理使用光标更改字段的,它将应用于整个应用程序:

Swift 3.0:

UITextField.appearance().tintColor = .black 

目标C:

[[UITextField appearance] setTintColor:[UIColor blackColor]];

同样的答案适用于个人UITextField

Swift 3.0:

myTextField.tintColor = .black 

物镜

[myTextField setTintColor:[UIColor blackColor]];

13
我发现这导致我的UIBarButton项目色彩变为固定的默认值,即使我将色彩设置为完全不同的东西也是如此。我通过在创建UITextField时分别设置其色调来解决该问题。
willtalmadge 2014年

这有效,但前提是您必须在didFinishLaunching中执行此操作?还是可以基于用户交互(例如按下按钮)来完成?
Steffen Andersen

@SteffenAndersen应当根据UIAppearance代理API文档进行操作。
DiscDev 2014年

[[UITextView外观] setTintColor:teal]; 由于某种原因,这改变了我的导航按钮的颜色,您是如何单独设置的?
约翰

3
在Swift 3.0上使用以下命令:UITextField.appearance()。tintColor = UIColor.black
Lucas Torquato

44

使用iOS7,您只需更改textField的tintColor


20

斯威夫特3:

  UITextField.appearance().tintColor = UIColor.black
  UITextView.appearance().tintColor = UIColor.black

1
在Swift 3.0上使用以下命令:UITextField.appearance()。tintColor = UIColor.black
Lucas Torquato

13

注意:此答案已过时,应仅用于iOS 7之前的开发。在iOS 7中使用外观代理查看1行解决方案的其他答案。

在我正在从事的项目中遇到相同的问题后,我想到了这个问题。

我设法创建了一个解决方案,由于它不使用任何现有的私有API,因此将被AppStore审核小组接受。

我创建了一个名为DGTextField的控件,该控件扩展了UITextField。


这很棒。坦率地说,因此,我一定会更加关注文档中的“符合”。但是,我很高兴只有一个人可以花时间阅读和修改。希望其他人能够看到并使用它!
RileyE

但是,我可能会建议使用动画选项,删除@propery并仅创建自定义插入符号宽度的setter和getter以及setter和getter。您可能没有兴趣,但是我总是喜欢这些小调整!
RileyE

@RileyE很高兴您能够从我的解决方案中受益。随意分叉仓库,并添加您想分享的任何调整。
2013年

3
在iOS 7中它要容易得多-请在下面查看我的答案:stackoverflow.com/a/18945907/1103584
DiscDev 2013年

12
yourTextField.tintColor = [UIColor whiteColor];

如果您在代码中进行设置,则可以使用它,因为“在某种程度上,颜色触发在Interface Builder(Xcode 6.1.1)中不起作用”。非常适合,而无需更改任何外观代理。


2
由于某些未知原因,它不适用于whiteColor,但可以与所有其他颜色一起使用(在iOS 8上测试)。我必须设置几乎是白色但不是白色的颜色才能使其正常工作。
Leszek Szary'17

@LeszekSzary嘿!你救了我的一天!我尝试了将近4个小时,您的话才是线索!苹果应该修复这个疯狂的错误,这确实会使开发人员发疯。
卡西克·拉梅什

10

设置tintColorUITextFieldUITextView工作方式不同。虽然对于UITextField您而言,更新后无需tintColor更改其他代码以更改光标颜色,但是对于UITextView您而言,这是必需的。

因此,设置后tintColorUITextView(这并不重要IB或代码),你需要调用textView.tintColorDidChange(),以应用它(实际上它会通过文本视图的配置到其子视图层次)。


5

这对我迅速起作用:

UITextField.tintColor = UIColor.blackColor()

您也可以在情节提要中进行设置:https : //stackoverflow.com/a/18759577/3075340


这行不通。我得到了错误:Instance member 'tintcolor' cannot be used on type 'UITextField'
pableiros

@pableiros以上是Swift2。也许您现在正在使用Swift 3?
2016年

我尝试了Swift 3和Swift 2.3,但不确定在Swift 2.2和更低版本上是否有效
pableiros

3

一种更通用的方法是设置UIView外观的tintColor。

UIColor *myColor = [UIColor purpleColor];
[[UIView appearance] setTintColor:myColor];

如果您使用许多默认的UI元素,这是有道理的。


2
嗯...这还有许多其他副作用...问题只是询问更改插入符号的颜色,您的答案将为应用程序中的每个UIView着色...这可能不是大多数人想要的方法采取。
DiscDev 2013年

如果目标只是更改插入符号的颜色,则+1太多的副作用。设置容器样式时,设置UIView tintColor很有用(但后来我不会使用[UIView appearance]
colinta 2014年

2

试试,它为我工作。

[[self.textField valueForKey:@"textInputTraits"] setValue:[UIColor redColor] strong textforKey:@"insertionPointColor"];

6
那是使用私有方法,但是谢谢您的建议。这很容易使应用程序被拒绝。
RileyE 2013年


0

Durgesh的方法确实有效。

我也多次使用这样的KVC解决方案。尽管它似乎没有证件,但是可以工作。坦白说,您在这里不使用任何私有方法-仅使用合法的键值编码。

PS昨天,我的新应用程序出现在AppStore中,这种方法没有任何问题。当我使用KVC更改某些只读属性(如navigatonBar)或私有ivars时,这不是第一种情况。


1
它不是在使用私有方法,而是在未记录密钥,这意味着它们不能用于App Store上的应用程序。您的申请可能会在主观上被拒绝。您必须有一个友好的审阅者,因为许多人拒绝使用该方法。
RileyE 2013年

然后,我有大约10位友善的审稿人:)和我的众多同事。
malex 2013年

1
为了澄清起见,在这种情况下,“键值编码”是使用便捷方法为属性分配值。我们使用该属性而不是使用setter的原因是因为该属性不可访问/隐藏/私有。
RileyE 2013年

1
在这里,我的意思是(也许我不知道重要的事情)只是关于KVC的文档并不暗示任何字面上的限制。所以我成功地使用了所有这些。希望其他人也可以。
malex 2013年

1
感激。但是,Apple在其“使用条款协议”中声明,我们被允许使用和公开讨论其文档中包含的任何内容,并禁止使用未记录的方法(将包括通过KVC访问“ textInputTraits” setter方法,因为属性未记录)。本质上,如果您在文档中找不到该方法,则将其禁止使用。但是,被禁止并不能保证被拒绝。我有一些应用程序被拒绝,原因是我的某些应用程序中包含了一些原因,这些应用程序都可以进入商店。未记录的方法会引起轰动。
RileyE 2013年


0

如果UITextFieldfrom是from,UISearchBar则首先获取textFieldfrom searchBar,然后应用tintColorproperty:

let textFieldInsideSearchBar = searchBar.value(forKey: "searchField") as? UITextField
textFieldInsideSearchBar?.tintColor = UIColor.lightGray

0

斯威夫特4

在viewDidLoad()中,只需调用以下代码:

代码样本

//txtVComplaint is a textView

txtVComplaint.tintColor = UIColor.white

txtVComplaint.tintColorDidChange()

0

我认为,如果您想要一些自定义颜色,则可以转到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上测试


0

对于在SwiftUI中搜索等效项的人Textfield来说accentColor

TextField("Label", text: $self.textToBind).accentColor(Color.red)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.