Swift - переопределить метод в двух подклассах UIView - PullRequest
0 голосов
/ 14 февраля 2019

Я использую пользовательские подклассы UITextField и UIButton - MyTextField и MyButton.

В обоих случаях я создаю закругленные края следующим образом:

var round = true
override func layoutSublayers(of layer: CALayer) {
    super.layoutSublayers(of: layer)
    layer.cornerRadius = round ? self.frame.height/5.0 : 0
}

Я пытаюсь найти общий способ сделать так, чтобы оба класса имели поле round и переопределить layoutSublayers(...).Что может быть лучше, чем вставлять один и тот же код в каждый класс?

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

A.используйте расширение, так как UIButton и UITextField являются подклассом UIView, вы можете попытаться создать расширение UIView с помощью метода func roundTheCorner(), но вы должны вызывать roundTheCorner в каждом layoutSublayers вашего настроенногоучебный класс.К вашему сведению: https://docs.swift.org/swift-book/LanguageGuide/Extensions.html

B.используйте среду выполнения для добавления настраиваемого свойства round, затем используйте метод swizzling для замены метода layoutSublayers.что может быть немного сложнее.К вашему сведению: https://nshipster.com/method-swizzling/

0 голосов
/ 14 февраля 2019

В качестве альтернативы, если вы хотите иметь действительно гибкий способ, вы можете использовать концепцию стилей представления.Вот простая реализация, с которой вы могли бы начать:

typealias Style<T> = (T) -> Void

extension UIView {

    convenience init<V: UIView>(with styles: [Style<V>]) {
        self.init(frame: .zero)
        guard let view = self as? V else {
            assertionFailure("Could not apply style for \(V.self) to \(type(of: self))")
            return
        }
        styles.forEach { $0(view) }
    }
}

, затем объявить некоторую таблицу стилей

enum ViewStyle {

    static func rounded(radius: CGFloat) -> Style<UIView> {
        return { view in
            view.layer.cornerRadius = radius
            view.clipsToBounds = true
        }
    }

    static let lightGray: Style<UIView> = { view in
        view.backgroundColor = .lightGray
    }
}

и использовать ее как

let button = UIButton(with: [ViewStyle.rounded(radius: 5.0)])
let textField = UITextField(with: [
    ViewStyle.rounded(radius: 8.0),
    ViewStyle.lightGray
])

Это позволит вамповторно использовать предопределенные стили и смешивать их для достижения более сложных настроек без создания собственных пользовательских подклассов.И, конечно, это всего лишь маленький тизер того, что можно сделать, я призываю вас пойти глубже:)

0 голосов
/ 14 февраля 2019

Возможно, самый простой способ - написать расширение для класса, от которого наследуются UIButton и UITextField, UIView.

extension UIView {
    func roundCorners(_ round: Bool) {
      layer.cornerRadius = round ? self.frame.height/5.0 : 0
     }
}

А затем назовите его где-нибудь в обоих ваших подклассах как

roundCorners(true)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...