Изменить UITextField и UITextView курсор / цвет каретки

222

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

Это вообще возможно?

RileyE
источник
1
Подробный ответ UITextField, в том числе о том, как это сделать в Интерфейсном Разработчике, по адресу stackoverflow.com/a/18759577/1709587
Марк Эмери
1
Простой и полный ответ на stackoverflow.com/a/18945907/1292230 ;)
RileyE

Ответы:

513

Если вы ориентируетесь на iOS 7+, это стало намного проще. Просто измените tintColorполе с помощью курсора, используя внешний вид прокси, и это будет применяться во всем приложении:

Swift 3.0:

UITextField.appearance().tintColor = .black 

Objective-C:

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

Тот же ответ относится к человеку UITextField:

Swift 3.0:

myTextField.tintColor = .black 

Objective-C

[myTextField setTintColor:[UIColor blackColor]];
DiscDev
источник
13
Я обнаружил, что это привело к тому, что цвета оттенка моего элемента UIBarButton стали фиксированными по умолчанию, даже если я установил цвет оттенка на что-то совершенно другое. Я решил проблему, установив цвет оттенка UITextFields индивидуально, когда они создаются.
Willtalmadge
Это работает, но только если вы делаете это в didFinishLaunching? Или вы можете сделать это на основе взаимодействия с пользователем, например, нажмите кнопку?
Штеффен Андерсен
@SteffenAndersen должен вести себя в соответствии с документацией API прокси-сервера UIAppearance.
DiscDev
[[UITextView внешний вид] setTintColor: teal]; по какой-то причине это меняет цвет моих навигационных кнопок, как вы настраивали индивидуально?
Джон
3
На Swift 3.0 используйте это: UITextField.appearance (). TintColor = UIColor.black
Лукас Торквато
44

С iOS7 вы можете просто изменить tintColor textField

Шапка
источник
20

Свифт 3:

  UITextField.appearance().tintColor = UIColor.black
  UITextView.appearance().tintColor = UIColor.black
Питер Крейнз
источник
1
На Swift 3.0 используйте это: UITextField.appearance (). TintColor = UIColor.black
Лукас Торквато
13

Примечание. Этот ответ устарел и должен использоваться только для разработки до iOS 7. Посмотрите другие ответы для однострочного решения с использованием внешнего прокси в iOS 7.

Я пришел к этому вопросу после того, как столкнулся с той же проблемой в проекте, над которым работал.

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

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

Дов
источник
Это круто. Честно говоря, из-за этого я определенно буду внимательно следить за "Соответствует" в документах. Тем не менее, я рад, что только одному человеку пришлось потратить время на чтение и возиться с этим. Надеюсь, другие люди смогут увидеть и использовать это!
RileyE
Однако я мог бы порекомендовать варианты анимации, удалив @propery и просто создавая сеттеры и геттеры, а также сеттер и геттер для настраиваемой ширины каретки. Возможно, вам это не интересно, но я всегда люблю маленькие хитрости!
RileyE
@RileyE Я рад, что вы смогли воспользоваться моим решением. Не стесняйтесь раскошелиться на репо и добавить любые изменения, которыми вы хотели бы поделиться.
Дов
3
В iOS 7 это намного проще - см. Мой ответ ниже: stackoverflow.com/a/18945907/1103584
DiscDev
12
yourTextField.tintColor = [UIColor whiteColor];

Это работает, если вы установите его в коде, потому что каким-то образом триггер цвета не делает этого в Интерфейсном Разработчике (Xcode 6.1.1). Хорошо подходит без необходимости менять внешний вид прокси.

Дэвид
источник
2
По какой-то неизвестной причине он не работает для меня с whiteColor, но работает с любым другим цветом (тестирование на iOS 8). Я должен был установить цвет, который почти белый, но не белый, чтобы это работало.
Лешек
@LeszekSzary Привет! Ты спас мой день! Я пытался почти 4 часа, и ваши слова были ключом! Apple должна исправить эту сумасшедшую ошибку, которая действительно сводит разработчика с ума.
Картик Рамеш
10

Настройка tintColorдля UITextFieldи UITextViewработает по-другому. Пока UITextFieldвам не нужно вызывать дополнительный код после обновления, tintColorчтобы изменить цвет курсора, но UITextViewвам нужно.

Таким образом, после установки tintColorдля UITextView(это не имеет значения в 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 Выше было сказано о Swift 2. Может быть, вы используете Swift 3 сейчас?
Micro
Я пробовал на Swift 3 и Swift 2.3, я не уверен, что на Swift 2.2 и ниже он работает
pableiros
3

Более общим подходом было бы установить tintColor внешнего вида UIView.

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

Имеет смысл, если вы используете много элементов пользовательского интерфейса по умолчанию.

arnekolja
источник
2
Хммм ... у этого есть много других побочных эффектов ... вопрос состоит только в том, чтобы изменить цвет каретки, и ваш ответ будет окрашивать каждый UIView в приложении ... это, вероятно, не тот подход, который хотят большинство людей брать.
DiscDev
+1 на это, слишком много побочных эффектов, если цель - просто изменить цвет каретки. Установка UIView tintColor полезна, когда вы стилизируете контейнер (но тогда я бы не стал использовать[UIView appearance]
colinta
2

Попробуйте, это работает для меня.

[[self.textField valueForKey:@"textInputTraits"] setValue:[UIColor redColor] strong textforKey:@"insertionPointColor"];
Durgesh
источник
6
Это использует частный метод, но спасибо за предложение. Это может легко отклонить заявку.
RileyE
0

Подход Дургеша работает.

Я также использовал такие решения KVC много раз. Несмотря на это, кажется, без документов, но это работает. Честно говоря, здесь вы не используете никаких частных методов - только кодирование значения ключа, которое является законным.

PS Вчера мое новое приложение появилось в AppStore без проблем с таким подходом. И это не первый случай, когда я использую KVC при изменении некоторых свойств, доступных только для чтения (например, navatonBar) или частных иваров.

Malex
источник
1
Это не использование закрытого метода, а то, что ключи недокументированы, что означает, что они не должны использоваться для приложений в App Store. Ваша заявка может быть отклонена субъективно. У вас, должно быть, был добрый рецензент, так как многие были отклонены за использование этого метода.
RileyE
Тогда у меня около 10 добрых рецензентов :) и моих многочисленных коллег тоже.
Малекс
1
Просто для пояснения, «Кодирование значения ключа» в этом случае присваивает значение свойству, используя удобный метод. Причина, по которой мы используем это, по сравнению с установщиком, заключается в том, что свойство недоступно / скрыто / приватно.
RileyE
1
Здесь я имею в виду (может быть, я не знаю чего-то важного) только то, что документация на KVC буквально не подразумевает каких-либо ограничений. Поэтому я успешно использую все это. И, надеюсь, могут другие.
Малекс
1
Ценится. Тем не менее, Apple в своем «Соглашении об условиях использования» заявляет, что нам разрешено использовать и открыто обсуждать все, что включено в их документацию, и запрещает использование недокументированных методов (доступ к методу textInputTraits через KVC будет включен, так как свойство недокументировано). По сути, если вы не можете найти метод в документации, это запрещено. Запрещенный не гарантирует отклонение, все же. Некоторые приложения были отклонены по причинам, включенным в некоторые из моих приложений, которые поступают в магазин. Это попало с недокументированными методами.
RileyE
0

Для версии Interface Builder со Swift

@IBOutlet weak var tvValue: UITextView! {
        didSet {
            tvValue.tintColor = .black
        }
    }
Майк Глухов
источник
0

Если UITextFieldэто from, UISearchBarто сначала получите textFieldfrom, searchBarа затем примените tintColorсвойство:

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

источник
0

Swift 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)
Beninho85
источник