Thay đổi màu UITextField và UITextView Con trỏ / Màu caret


222

Tôi đang tự hỏi về việc thay đổi màu sắc của con trỏ / dấu mũ trong một UITextField(Và UITextViewnếu đó là cùng một câu trả lời) trong iOS. Tôi đã thấy câu trả lời cho sự phát triển OSX, nhưng không có gì cho iOS.

Điều này thậm chí có thể?


1
Câu trả lời chi tiết cho UITextField, bao gồm cách thực hiện việc này trong Trình tạo giao diện, tại stackoverflow.com/a/18759577/1709587
Mark Amery

1
Câu trả lời đơn giản và đầy đủ tại stackoverflow.com/a/18945907/1292230 ;)
RileyE

Câu trả lời:


513

Nếu bạn đang nhắm mục tiêu iOS 7+, việc này đã được thực hiện dễ dàng hơn nhiều. Chỉ cần thay đổi tintColortrường bằng một con trỏ bằng proxy xuất hiện và nó sẽ được áp dụng trong toàn bộ ứng dụng:

Swift 3.0:

UITextField.appearance().tintColor = .black 

Mục tiêu-C:

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

Câu trả lời tương tự áp dụng cho một cá nhân UITextField:

Swift 3.0:

myTextField.tintColor = .black 

Mục tiêu-C

[myTextField setTintColor:[UIColor blackColor]];

13
Tôi thấy điều này khiến cho các mục màu UIBarButton của tôi bị cố định với các giá trị mặc định của chúng ngay cả khi tôi đặt màu sắc thành một thứ hoàn toàn khác. Tôi đã giải quyết vấn đề bằng cách đặt màu sắc riêng của UITextFields khi chúng được tạo.
willtalmadge

Điều này hoạt động, nhưng chỉ khi bạn làm điều đó trong didFinishLaunching? Hoặc bạn có thể làm điều đó dựa trên sự tương tác của người dùng, ví dụ nhấn một nút?
Steffen Andersen

@SteffenAndersen nó nên hoạt động theo tài liệu API proxy UIAppparent.
DiscDev

[[Xuất hiện UITextView] setTintColor: teal]; vì một số lý do, điều này làm thay đổi màu sắc của các nút điều hướng của tôi, làm thế nào bạn thiết lập cá nhân?
Giăng

3
Trên Swift 3.0, hãy sử dụng cái này: UITextField.appparent (). TintColor = UIColor.black
Lucas Torquato


20

Swift 3:

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

1
Trên Swift 3.0, hãy sử dụng cái này: UITextField.appparent (). TintColor = UIColor.black
Lucas Torquato

13

Lưu ý: Câu trả lời này đã hết hạn và chỉ nên được sử dụng cho phát triển trước iOS 7. Xem các câu trả lời khác cho giải pháp 1 dòng bằng proxy xuất hiện trong iOS 7.

Tôi đã đến câu hỏi này sau khi tôi gặp phải vấn đề tương tự trong một dự án mà tôi đang thực hiện.

Tôi đã quản lý để tạo một giải pháp sẽ được nhóm đánh giá AppStore chấp nhận vì nó không sử dụng bất kỳ API riêng tư hiện có nào.

Tôi đã tạo một điều khiển có tên DGTextField mở rộng UITextField.


Điều đó thật tuyệt. Thành thật mà nói, vì điều này, tôi chắc chắn sẽ theo dõi chặt chẽ hơn về "Tuân thủ" trong các tài liệu. Tuy nhiên, tôi mừng vì chỉ có một người phải dành thời gian đọc và mày mò về điều này. Hy vọng rằng những người khác sẽ có thể nhìn thấy và sử dụng này!
RileyE

Tuy nhiên, tôi có thể đề xuất các tùy chọn hoạt hình, loại bỏ @propery và chỉ tạo setters và getters cũng như setter và getter cho chiều rộng caret tùy chỉnh. Bạn có thể không quan tâm, nhưng tôi luôn thích những điều chỉnh nhỏ!
RileyE

@RileyE Tôi rất vui vì bạn đã có thể hưởng lợi từ giải pháp của tôi. Hãy thoải mái rẽ nhánh repo và thêm bất kỳ chỉnh sửa nào bạn muốn chia sẻ.
Dov

3
Nó dễ dàng hơn nhiều trong iOS 7 - xem câu trả lời của tôi dưới đây: stackoverflow.com/a/18945907/1103584
DiscDev

12
yourTextField.tintColor = [UIColor whiteColor];

Nó hoạt động nếu bạn đặt mã, 'bằng cách nào đó, trình kích hoạt màu không thực hiện được trong Trình tạo giao diện (Xcode 6.1.1). Nó rất phù hợp mà không cần phải thay đổi bất kỳ proxy xuất hiện.


2
Vì một số lý do không rõ, nó không hoạt động với tôi với whiteColor nhưng hoạt động với mọi màu khác (thử nghiệm trên iOS 8). Tôi đã phải thiết lập màu gần như trắng nhưng không phải màu trắng để làm cho nó hoạt động.
Leszek Szary

@LeszekSzary Này! Bạn đã cứu ngày của tôi! Tôi đã cố gắng gần 4 giờ và lời nói của bạn là đầu mối! Apple nên sửa lỗi điên này thực sự khiến nhà phát triển phát điên.
Karthick Ramesh

10

Thiết tintColorcho UITextFieldUITextViewcông trình khác nhau. Mặc dù đối với UITextFieldbạn không cần gọi thêm mã sau khi cập nhật tintColorđể thay đổi màu con trỏ, nhưng đối với UITextViewbạn cần.

Vì vậy, sau khi cài đặt tintColorcho UITextView(nó không quan trọng trong IB hoặc trong mã), bạn cần phải gọi textView.tintColorDidChange()để áp dụng nó (trên thực tế nó sẽ vượt qua cấu hình xem văn bản của hệ thống phân cấp xuống subviews của nó).


5

Điều này làm việc cho tôi nhanh chóng:

UITextField.tintColor = UIColor.blackColor()

Bạn cũng có thể thiết lập điều này trong bảng phân cảnh: https://stackoverflow.com/a/18759577/3075340


Điều này không hoạt động. Tôi đã nhận được lỗi:Instance member 'tintcolor' cannot be used on type 'UITextField'
pableiros 2/11/2016

@pableiros Ở trên là với Swift 2. Có lẽ bạn đang sử dụng Swift 3 bây giờ?
Micro

Tôi đã thử trên Swift 3 và Swift 2.3, tôi không chắc nếu trên Swift 2.2 và hạ thấp nó hoạt động
pableiros

3

Một cách tiếp cận tổng quát hơn sẽ là thiết lập tintColor của UIView.

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

Có ý nghĩa nếu bạn đang sử dụng nhiều yếu tố UI mặc định.


2
Hmmm ... điều này có nhiều tác dụng phụ khác ... câu hỏi chỉ hỏi về việc thay đổi màu sắc của dấu mũ, và câu trả lời của bạn sẽ nhuốm màu mỗi UIView trong ứng dụng ... đây có lẽ không phải là cách tiếp cận mà hầu hết mọi người muốn để lấy.
DiscDev

+1 trên đó, quá nhiều tác dụng phụ, nếu mục tiêu chỉ là thay đổi màu sắc caret. Cài đặt UIView tintColor IS hữu ích khi bạn tạo kiểu cho một thùng chứa (nhưng sau đó tôi sẽ không sử dụng[UIView appearance]
colinta

2

Hãy thử, nó làm việc cho tôi.

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

6
Đó là sử dụng một phương pháp riêng tư, nhưng cảm ơn bạn đã gợi ý. Điều này có thể dễ dàng nhận được một ứng dụng bị từ chối.
RileyE


0

Cách tiếp cận của Durgesh không hoạt động.

Tôi cũng đã sử dụng các giải pháp KVC như vậy nhiều lần. Mặc dù nó dường như không có giấy tờ, nhưng nó hoạt động. Thành thật mà nói, bạn không sử dụng bất kỳ phương pháp riêng tư nào ở đây - chỉ Mã hóa giá trị khóa là hợp pháp.

PS Hôm qua, ứng dụng mới của tôi đã xuất hiện tại AppStore mà không gặp vấn đề gì với phương pháp này. Và đó không phải là trường hợp đầu tiên khi tôi sử dụng KVC trong việc thay đổi một số thuộc tính chỉ đọc (như navigatonBar) hoặc ivars riêng.


1
Đó không phải là sử dụng một phương thức riêng tư, mà là các khóa không có giấy tờ, điều đó có nghĩa là chúng không được sử dụng cho các ứng dụng trên App Store. Ứng dụng của bạn có thể bị từ chối một cách chủ quan. Bạn phải có một người đánh giá tử tế, vì nhiều người đã bị từ chối vì sử dụng phương pháp đó.
RileyE

Sau đó, tôi có khoảng 10 người đánh giá loại :) và nhiều đồng nghiệp của tôi cũng vậy.
malex

1
Chỉ cần làm rõ, "Mã hóa giá trị khóa" trong trường hợp này là gán giá trị cho một thuộc tính bằng phương thức tiện lợi. Lý do chúng tôi sử dụng điều đó, so với một setter, là vì tài sản không thể truy cập / ẩn / riêng tư.
RileyE

1
Ý tôi là (có lẽ tôi không biết điều gì quan trọng) chỉ có tài liệu về KVC không bao hàm bất kỳ hạn chế nào theo nghĩa đen. Vì vậy, tôi sử dụng thành công tất cả những điều này. Và hy vọng những người khác có thể.
malex

1
Đánh giá cao. Tuy nhiên, Apple, trong 'Thỏa thuận sử dụng' của họ tuyên bố rằng chúng tôi được phép sử dụng và thảo luận công khai bất cứ điều gì có trong tài liệu của họ và cấm sử dụng các phương thức không có giấy tờ (Truy cập phương thức cài đặt 'textInputTraits' thông qua KVC sẽ được đưa vào, như tài sản là không có giấy tờ). Về cơ bản, nếu bạn không thể tìm thấy phương pháp trong tài liệu, nó bị cấm. Nghiêm cấm không đảm bảo từ chối, mặc dù. Tôi đã có một số ứng dụng bị từ chối vì lý do có trong một số ứng dụng của tôi đưa nó vào cửa hàng. Đó là đánh và bỏ lỡ với các phương pháp không có giấy tờ.
RileyE

0

Dành cho phiên bản Trình tạo giao diện với Swift

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

0

Nếu UITextFieldlà từ UISearchBartrước thì lấy textFieldtừ searchBarvà sau đó áp dụng thuộc tintColortính:

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

0

Swift 4

Trong viewDidLoad () chỉ cần gọi mã bên dưới:

MẪU MÃ

//txtVComplaint is a textView

txtVComplaint.tintColor = UIColor.white

txtVComplaint.tintColorDidChange()

0

Tôi nghĩ rằng nếu bạn muốn một số màu tùy chỉnh, bạn có thể vào Assets.xcassetsthư mục, nhấp chuột phải và chọnNew Color Set , sau khi bạn tạo màu bạn đã đặt, hãy đặt tên cho nó để sử dụng lại.

Và bạn có thể sử dụng nó như thế này:

import UIKit 

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        UITextField.appearance().tintColor = UIColor(named: "YOUR-COLOR-NAME")  #here
    }
}

Đã thử nghiệm trên macOS 10.15 / iOS 13 / Swift 5


0

Đối với những người tìm kiếm tương đương trong SwiftUI cho Textfieldđiều này là accentColor:

TextField("Label", text: $self.textToBind).accentColor(Color.red)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.