Когда вы вызываете два метода для обновления цвета и шрифта атрибутивных заполнителей, вы перезаписываете один последним.Итак, если вы устанавливаете цвет первым, а шрифт вторым, атрибут цвета удаляется при установке атрибута шрифта.
Простой способ избежать этого - начать с одной точки входа, которая обновляет атрибуты заполнителя., который используется и методами установки цвета и шрифта.Я использовал вычисляемое свойство, которое имеет и геттер, и сеттер - оно может получать и устанавливать текущие атрибуты заполнителя.
extension UITextField {
var placeholderColor: UIColor? {
get { return placeholderAttributes?[.foregroundColor] as? UIColor }
set { placeholderAttributes?[.foregroundColor] = newValue }
}
var placeholderFont: UIFont? {
get { return placeholderAttributes?[.font] as? UIFont }
set { placeholderAttributes?[.font] = newValue }
}
var placeholderAttributes: [NSAttributedString.Key: Any]? {
get { return attributedPlaceholder?.attributes(at: 0, effectiveRange: nil) }
set { attributedPlaceholder = .init(string: placeholder ?? "", attributes: newValue) }
}
}
Так что сократите ваше расширение UISearchBar
(я бы заменил getSearchBarTextField
метод с вычисляемым свойством textField
), мы можем удалить любую ссылку на приписанные строки и т. Д.
var textField: UITextField? {
return getViewElement(type: UITextField.self)
}
func setTextColor(color: UIColor) {
textField?.textColor = color
}
func setPlaceholderTextColor(color: UIColor) {
textField?.placeholderColor = color
}
func setPlaceholderFont(font: UIFont) {
textField?.placeholderFont = font
}
Хотя свойства с соответствующими типами (UIColor
, UIFont
) могутВ некоторых ситуациях это может пригодиться, вам технически не нужны свойства placeholderColor
и placeholderFont
, поскольку вы можете просто установить их, используя свойство текстового поля placeholderAttributes
из расширения.
extension UITextField {
var placeholderAttributes: [NSAttributedString.Key: Any]? {
get { return attributedPlaceholder?.attributes(at: 0, effectiveRange: nil) }
set { attributedPlaceholder = .init(string: placeholder ?? "", attributes: newValue) }
}
}
extension UISearchBar {
// ...
func setPlaceholderTextColor(color: UIColor) {
textField?.placeholderAttributes?[.foregroundColor] = color
}
func setPlaceholderfont(fontfamily: UIFont) {
textField?.placeholderAttributes?[.font] = fontfamily
}
}