Управление цветом текста местозаполнителя из пользовательского класса @IBDesignable UITextField.Swift 4.2, Xcode 10 - PullRequest
0 голосов
/ 23 сентября 2018

Я создал Cocoa Touch Class:

  • Подкласс UITextField
  • И имя файла MyTextFieldStyle

А воттакое файл MyTextFieldStyle.swift:

import UIKit

@IBDesignable

class MyTextFieldStyle: UITextField {

@IBInspectable var FavoriteTextColor : UIColor = UIColor.white {
    didSet {
        self.textColor = FavoriteTextColor
    }
}

override func awakeFromNib() {
    super.awakeFromNib()
    self.textColor = self.FavoriteTextColor
}

}

Как добавить эти 3 элемента управления,

  • цвет текста placeHolder
  • тип шрифта для заполнителя
  • размер шрифта для заполнителя

, как, например, «FavoriteTextColor» выше?(Swift 4.2 и Xcode 10)

1 Ответ

0 голосов
/ 23 сентября 2018

Я бы сделал мой IBDesignables по-другому.Я бы поставил все свои последние назначения в одну и ту же функцию, например, вот мой собственный UITextField, который я использую.

@IBDesignable public class HooopTextfield: UITextField, UITextFieldDelegate {

    @IBInspectable public var fontName: String? = "AvenirNext-Bold" {
        didSet {
            decorate()
        }
    }

    @IBInspectable public var fontSize: CGFloat = 15 {
        didSet {
            decorate()
        }
    }

    @IBInspectable public var fontColor: UIColor = UIColor.white {
        didSet {
            decorate()
        }
    }

    @IBInspectable public var customTextAlignment: Int = 0 {
        didSet {
            decorate()
        }
    }

    @IBInspectable public var borderColor: UIColor = UIColor.white {
        didSet {
            decorate()
        }
    }

    @IBInspectable public var letterSpacing: CGFloat = 0 {
        didSet {
            decorate()
        }
    }

    @IBInspectable public var cornerRadius: CGFloat = 0 {
        didSet {
            decorate()
        }
    }

    @IBInspectable public var customPlaceholder: String? = nil {
        didSet {
            decorate()
        }
    }

    @IBInspectable public var horizontalInset: CGFloat = 0 {
        didSet {
            decorate()
        }
    }

    @IBInspectable public var verticalInset: CGFloat = 0 {
        didSet {
            decorate()
        }
    }

    @IBInspectable public var selfDelegate: Bool = false {
        didSet {
            if selfDelegate {
                self.delegate = self
            }
        }
    }

    @IBInspectable public var borderWidth: CGFloat = 0 {
        didSet {
            decorate()
        }
    }

    @IBInspectable public var baseLineOffset: CGFloat = 0 {
        didSet {
            decorate()
        }
    }

    @IBInspectable public var placeholderColor: UIColor? = nil {
        didSet {
            decorate()
        }
    }

    @IBInspectable public var requiredColor: UIColor? = nil {
        didSet {
            decorate()
        }
    }

    @IBInspectable public var requiredCharacter: String = "*"{
        didSet {
            decorate()
        }
    }

    @IBOutlet public var nextField:HooopTextfield?

    /*** more inspectable var can be added **/

    override public func textRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.insetBy(dx: horizontalInset, dy: verticalInset)
    }

    override public func editingRect(forBounds bounds: CGRect) -> CGRect {
        return bounds.insetBy(dx: horizontalInset, dy: verticalInset)
    }

    func decorate() {
        // Setup border and corner radius
        self.layer.cornerRadius = cornerRadius
        self.layer.borderWidth = borderWidth
        self.layer.borderColor = borderColor.cgColor
        // Setup text style
        let paragraphStyle: NSMutableParagraphStyle = NSMutableParagraphStyle()
        switch customTextAlignment {
        case 2:
            paragraphStyle.alignment = .right
            break
        case 1:
            paragraphStyle.alignment = .center
            break
        default:
            paragraphStyle.alignment = .left
            break
        }
        var titleAttributes:[NSAttributedStringKey : Any] = [
            NSAttributedStringKey.foregroundColor: fontColor,
            NSAttributedStringKey.kern: letterSpacing,
            NSAttributedStringKey.baselineOffset: baseLineOffset,
            NSAttributedStringKey.paragraphStyle: paragraphStyle
        ]
        if let _ = fontName {
            titleAttributes[NSAttributedStringKey.font] = UIFont(name: fontName!, size: fontSize)
        }
        if let _ = customPlaceholder {
            var placeholderAttributes = titleAttributes
            if let _ = placeholderColor {
                placeholderAttributes[NSAttributedStringKey.foregroundColor] = placeholderColor
            }
            let attributedPlaceholder = NSMutableAttributedString(string: customPlaceholder!, attributes: placeholderAttributes)
            if let _ = requiredColor {
                let range = (customPlaceholder! as NSString).range(of: requiredCharacter)
                attributedPlaceholder.addAttribute(NSAttributedStringKey.foregroundColor, value: requiredColor!, range: range)
            }
            self.attributedPlaceholder = attributedPlaceholder
        }
        self.defaultTextAttributes = titleAttributes
    }

    // MARK: - UITexfieldDelegate

    public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if (nextField != nil) {
            nextField?.becomeFirstResponder()
        }
        return true
    }
}

У меня есть базовые вещи, такие как fontColor, fontSize, fontNameТо же самое для заполнителя.Тогда у меня есть больше визуальных вещей, таких как borderColor, cornerRadius, borderWidth и т. Д. Наконец, у меня также есть некоторые прямоугольные вставки для выравнивания всего, что я хочу, прямо из моей раскадровки.Я использую NSMutableAttributedString для них, потому что они наиболее настраиваемы, что позволяет мне также иметь возможность раскрашивать необходимые поля и тому подобное.

Наконец, у меня также есть немного @IBOutlet, который также позволяет мне прыгать с одноготекстовое поле для следующего с помощью следующей кнопки на клавиатуре в сочетании с логическим значением selfDelegate.

Задайте мне любые вопросы по этому поводу и поэкспериментируйте с ними, вы должны иметь возможность делать все, что угодно@IBDesignable Я думаю.

РЕДАКТИРОВАТЬ 1: Прежде чем забыть, я рекомендую использовать decorate или эквивалентную функцию, потому что порядок применения ваших изменений имеет значение в большинстве случаев.

РЕДАКТИРОВАТЬ 2:Исправлены ошибки, это, скорее всего, было связано с быстрым изменением использования атрибутов NSAttributedString, но, как ни странно, placeholderAttributes должно было быть [NSAttributedStringKey: Any], а defaultTextAttributes - [String: Any], не знаю почемуэто было бы так.Но теперь это должно работать.

РЕДАКТИРОВАТЬ 3: Возможно, потому что у меня другая версия Xcode или потому что это была игровая площадка, у меня было сообщение для defaultTextAttributes, но я исправил его, удалив .rawValue, если онбыло наоборот, знайте, что NSAttributedStringKey.key.rawValue будет строкой, и вы можете получить NSAttributedStringKey, используя NSAttributedStringKey.init(rawValue:String)

...