Я бы сделал мой 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)