Как я могу поделиться повторно использованным UIImageView с протоколами? - PullRequest
0 голосов
/ 03 января 2019

Я не уверен, если это возможно, однако у меня есть несколько пользовательских UITableViewCells, каждый из которых содержит некоторые общие компоненты.

Например, все они содержат UIIMageView, который представляетаватар пользователя:

   fileprivate var messageAvatar: UIImageView = {
        let imageView = UIImageView(frame: .zero)
        imageView.layer.cornerRadius = 35 / 2
        imageView.layer.masksToBounds = true
        imageView.image = #imageLiteral(resourceName: "user_avatar")
        return imageView
    }()

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

protocol MyCustomCellProtocol: class {
    var avatar: UIImageView { get set }
}

extension MyCustomCellProtocol {
    var avatar: UIImageView {
        let imageView = UIImageView(frame: .zero)
        imageView.layer.cornerRadius = 35 / 2
        imageView.layer.masksToBounds = true
        return imageView
    }
}

Чего я не понимаю, так это как я могу их инициализировать или использовать в своих пользовательских ячейках.

Это правильный подход?

1 Ответ

0 голосов
/ 03 января 2019

Я думаю, лучше было бы создать подкласс UIImageView с установкой свойств "default" внутри awakeFromNib

class AvatarImageView: UIImageView {
    override func awakeFromNib() {
        layer.cornerRadius = 35 / 2
        layer.masksToBounds = true
    }
}

, тогда вы можете создать представление изображения как переменную lazy для своего собственного подкласса внутризанятия, когда вам это нужно

lazy var messageAvatar: AvatarImageView = {
    let imageView = AvatarImageView(frame: .zero)
    imageView.image = UIImage(named: "user_avatar")
    return imageView
}()
...