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

我想知道在iOS中改变UITextField(和UITextView如果答案相同)中的光标/插入符号的颜色。我看到过OSX开发的答案,但没有iOS的答案。

这可能吗?

137743 次浏览

这只能通过访问私有财产来实现,因此可能会导致苹果AppStore应用程序被拒绝。

看看这个Stackoverflow问题

注意:这个答案已经过时了,应该只用于ios 7之前的开发。查看iOS 7中使用外观代理的1行解决方案的其他答案。

我是在一个项目中遇到同样的问题后想到这个问题的。

我设法创建了一个解决方案,它将被AppStore审查团队接受,因为它不使用任何现有的私有api。

我已经创建了一个名为DGTextField扩展UITextField控件。

试试,这对我很有用。

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

在iOS7中,你可以简单地改变textField的tintColor

杜格什的方法确实有效。

我也多次使用这样的KVC解决方案。 尽管它似乎没有证件,但它是有效的。坦白地说,你什么都不用 private方法-只有合法的键值编码。

附注:昨天我的新应用出现在AppStore时,这种方法没有任何问题。当我使用KVC改变一些只读属性(如navigatonBar)或私有ivars时,这并不是第一次。

如果你的目标系统是iOS 7+,这就简单多了。只需使用外观代理用游标更改字段的tintColor,它将应用于整个应用程序:

斯威夫特3.0:

UITextField.appearance().tintColor = .black

objective - c:

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

同样的答案适用于个人UITextField:

斯威夫特3.0:

myTextField.tintColor = .black

objective - c

[myTextField setTintColor:[UIColor blackColor]];

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

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

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

斯威夫特3:

  UITextField.appearance().tintColor = UIColor.black
UITextView.appearance().tintColor = UIColor.black
yourTextField.tintColor = [UIColor whiteColor];

如果你在代码中设置它,它就能工作,因为不知怎的在界面构建器中,颜色触发器不会这样做 (Xcode 6.1.1)。它非常适合,不需要更改任何外观代理。

这在swift中很管用:

UITextField.tintColor = UIColor.blackColor()

你也可以在storyboard: https://stackoverflow.com/a/18759577/3075340中设置

接口生成器版本与Swift

@IBOutlet weak var tvValue: UITextView! {
didSet {
tvValue.tintColor = .black
}
}

如果UITextField来自UISearchBar,则首先从searchBar获取textField,然后应用tintColor属性:

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

UITextFieldUITextView设置tintColor的工作方式不同。 虽然对于UITextField,你不需要在更新tintColor后调用额外的代码来改变光标的颜色,但对于UITextView,你需要

因此,在为UITextView设置tintColor之后(在IB中还是在code中),你需要调用textView.tintColorDidChange()来应用它(实际上它将把文本视图的配置传递到它的子视图层次结构中)。

斯威夫特4

在viewDidLoad()中只调用下面的代码:

代码示例

//txtVComplaint is a textView


txtVComplaint.tintColor = UIColor.white


txtVComplaint.tintColorDidChange()

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

对于在SwiftUI中搜索Textfield的人来说,这是accentColor:

TextField("Label", text: $self.textToBind).accentColor(Color.red)