【问题标题】:Change UITextField and UITextView Cursor / Caret Color更改 UITextField 和 UITextView 光标/插入符号颜色
【发布时间】:2012-07-21 07:17:24
【问题描述】:

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

这可能吗?

【问题讨论】:

标签: ios colors uitextfield uitextview text-cursor


【解决方案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 中要容易得多 - 请参阅下面的答案:stackoverflow.com/a/18945907/1103584
    【解决方案6】:

    UITextFieldUITextView 设置tintColor 的工作方式不同。 对于UITextField,您不需要在更新tintColor 后调用其他代码来更改光标颜色,但对于UITextView,您需要。

    所以在为UITextView 设置tintColor 之后(在IB 或代码中都没有关系)你需要调用textView.tintColorDidChange() 来应用它(实际上它会将文本视图的配置传递到它的子视图层次结构)。

    【讨论】:

      【解决方案7】:

      这对我很有效:

      UITextField.tintColor = UIColor.blackColor()
      

      您也可以在情节提要中设置:https://stackoverflow.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 Stackoverflow 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()
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2012-07-16
                  • 2010-10-20
                  • 2011-01-12
                  • 2020-12-01
                  • 2018-10-28
                  • 1970-01-01
                  • 2015-09-07
                  • 2013-08-28
                  相关资源
                  最近更新 更多