Змініть UITextField та UITextView колір курсору / каретки


222

Мені цікаво про зміну кольору курсора / карети в UITextFieldUITextViewякщо це однакова відповідь) в iOS. Я бачив відповіді на розробку OSX, але нічого для iOS.

Це навіть можливо?


1
Детальна відповідь UITextField, зокрема про те, як це зробити в Interface Builder, за адресою stackoverflow.com/a/18759577/1709587
Марк Амерді

1
Простий і повну відповідь на stackoverflow.com/a/18945907/1292230 ;)
RileyE

Відповіді:


512

Якщо ви орієнтуєтесь на 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 закріпилися за значеннями за замовчуванням, навіть якщо я встановив колір відтінку щось зовсім інше. Я вирішив проблему, встановивши колір відтінку UITextFields індивідуально під час їх створення.
willtalmadge

Це працює, але лише якщо ви це робите в didFinishLaunching? Або ви можете це зробити на основі взаємодії з користувачем, наприклад натиснути кнопку?
Стеффен Андерсен

@SteffenAndersen він повинен вести себе відповідно до документації API проксі-сервера UIAppearance.
DiscDev

[[UITextView поява] setTintColor: teal]; Чомусь це змінює колір моїх кнопок навігації, як ви встановили нерозривно?
Джон

3
На Swift 3.0 використовуйте це: UITextField.appearance (). TintColor = UIColor.black
Лукас Торквато

44

За допомогою iOS7 ви можете просто змінити tintColor текстового поля



13

Примітка. Ця відповідь застаріла і її слід використовувати лише для розробок до iOS 7. Дивіться інші відповіді щодо рішення на 1 рядок, використовуючи проксі-сервер зовнішнього вигляду в iOS 7.

Я прийшов до цього питання після того, як зіткнувся з тією ж проблемою в проекті, над яким працював.

Мені вдалося створити рішення, яке буде прийняте командою з огляду AppStore, оскільки воно не використовує жодних існуючих приватних API.

Я створив елемент управління під назвою DGTextField, який розширює UITextField.


Це чудово. Чесно кажучи, через це я обов'язково буду уважніше стежити за "Відповідностям" у документах. Однак я радий, що лише одній людині довелося витрачати час на це, читаючи та розмовляючи. Сподіваємось, інші люди зможуть це побачити та використати!
RileyE

Однак я можу порекомендувати параметри анімації, видаливши @propery і просто створивши сеттери та геттери, а також сеттер і геттер для власної ширини каретки. Можливо, вам не цікаво, але я завжди люблю маленькі твісти!
RileyE

@RileyE Я радий, що ти зміг отримати користь від мого рішення. Не соромтеся роздрібнити репо і додайте будь-які налаштування, якими ви хочете поділитися.
Дов

3
Це набагато простіше в прошивці 7 - см моєї відповіді нижче: stackoverflow.com/a/18945907/1103584
DiscDev

12
yourTextField.tintColor = [UIColor whiteColor];

Це працює, якщо ви встановите його в коді, 'тому, що кольоровий триггер якось не робить це в Interface Builder (Xcode 6.1.1). Він добре підходить без необхідності змінювати будь-який проксі-сервер.


2
З незрозумілої причини він не працює для мене з whiteColor, але працює з будь-яким іншим кольором (тестування на iOS 8). Мені довелося встановити майже білий колір, але не білий, щоб він працював.
Лешек Сзарі

@LeszekSzary Гей! Ти врятував мій день! Я намагався майже 4 години, і ваші слова були підказкою! Apple повинна виправити цю шалену помилку, яка справді зводить з розуму розробника.
Картік Рамеш

10

Установка tintColorдля UITextFieldі UITextViewпрацює по- іншому. Тоді як UITextFieldвам не потрібно телефонувати додатковий код після оновлення, tintColorщоб змінити колір курсору, але для цього UITextViewпотрібно.

Таким чином , після установки tintColorдля UITextView(не має значення в МБ або в коді) вам потрібно зателефонувати textView.tintColorDidChange(), щоб застосувати його ( на насправді вона буде проходити конфиг Вид тексту вниз до його підвиди ієрархії).


5

Це працювало для мене швидко:

UITextField.tintColor = UIColor.blackColor()

Ви також можете встановити це в раскадровці: https://stackoverflow.com/a/18759577/3075340


Це не працює. Я отримав помилку:Instance member 'tintcolor' cannot be used on type 'UITextField'
pableiros

@pableiros Вище було з Swift 2. Можливо, ви зараз використовуєте Swift 3?
Мікро

Я спробував на Swift 3 і Swift 2.3, я не впевнений, чи працює на Swift 2.2 і нижче
pableiros

3

Більш загальним підходом було б встановлення кольору TIVColor у зовнішньому вигляді.

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

Має сенс, якщо ви використовуєте багато елементів інтерфейсу за замовчуванням.


2
Гммм ... у цього є багато інших побічних ефектів ... питання полягає лише в тому, щоб змінити колір каретки, і ваша відповідь буде підфарбовувати кожен UIView в додатку ... це, мабуть, не підхід, який хочуть більшість людей брати.
DiscDev

+1 на це, занадто багато побічних ефектів, якщо мета - просто змінити колір каре. Налаштування UIView tintColor ВИ корисно, коли ви створюєте контейнер (але тоді я б не користувався[UIView appearance]
colinta

2

Спробуйте, це працює на мене.

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

6
Це використовується приватний метод, але дякую за пропозицію. Це може легко відхилити заявку.
RileyE


0

Підхід Дургеша справді працює.

Я також багато разів використовував такі рішення KVC. Незважаючи на те, що здається незадокументованим, але це працює. Відверто кажучи, ви тут не використовуєте жодних приватних методів - лише кодування Key-Value, яке є законним.

PS Вчора моя нова програма з’явилася в AppStore без проблем із цим підходом. І це не перший випадок, коли я використовую KVC для зміни деяких властивостей лише для читання (наприклад, navigatonBar) або приватних ivars.


1
Це не використання приватного методу, а скоріше те, що ключі незадокументовані, це означає, що вони не повинні використовуватися для додатків у App Store. Ваша заявка може бути відхилена суб'єктивно. У вас, мабуть, був добрий рецензент, оскільки багатьох людей відхилили за використання цього методу.
RileyE

Тоді у мене є близько 10 добрих рецензентів :) і мої численні колеги теж.
malex

1
Просто для уточнення "Кодування ключових значень" у цьому випадку присвоює значення властивості за допомогою зручного методу. Причиною того, що ми користуємося цим, а не сетером, є те, що властивість недоступна / прихована / приватна.
RileyE

1
Тут я маю на увазі (можливо, я не знаю чогось важливого) лише те, що документація на KVC не передбачає жодних обмежень буквально. Тому я успішно використовую все це. І сподіваємось, можуть інші.
malex

1
Вдячний. Однак Apple, у своїй Угоді про використання, вказує, що нам дозволяється використовувати та відкрито обговорювати все, що входить у їх документацію, і забороняє використовувати незадокументовані методи (Доступ до методу встановлення 'textInputTraits' через KVC буде включено як властивість недокументовано). По суті, якщо ви не можете знайти метод у документації, це заборонено. Однак заборонене не гарантує відхилення. У мене були відхилені деякі програми з причин, включених до деяких моїх додатків, які переносять його в магазин. Це удари і промахування бездокументованими методами.
RileyE


0

Якщо UITextFieldз того UISearchBarчасу, спочатку дістаньте textFieldз, searchBarа потім застосуйте tintColorвластивість:

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.