обновление классов в swift - PullRequest
0 голосов
/ 24 октября 2018

Я ищу решение моей проблемы.У меня есть класс, который создает для меня UIButton:

class MenuButton: UIButton {

    var x: CGFloat
    var y: CGFloat
    var width: CGFloat
    var height: CGFloat

    required init(parent: UIView = UIView(), x: CGFloat = 0, y: CGFloat = 0, width: CGFloat = 40, height: CGFloat = 40) {

        self.x = x
        self.y = y
        self.width = width
        self.height = height

        super.init(frame: .zero)

        frame = CGRect(x: x, y: y, width: width, height: height)
        backgroundColor = global.labelColor
        setTitleColor(#colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), for: .normal)
        layer.cornerRadius = self.frame.height / 2

        if x < 0 {
            frame = CGRect(x: superview?.frame.width ?? 0 - abs(x) - frame.width, y: frame.minY, width: frame.width, height: frame.height)
        }

        if y < 0 {
            frame = CGRect(x: frame.minX, y: superview?.frame.height ?? 0 - abs(y) - frame.height, width: frame.width, height: frame.height)
        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

Затем я добавляю константу, назначенную этому классу:

let pauseButton = MenuButton()

Это работает нормально, и кнопка отображается насцена со всем по умолчанию.Теперь я хочу добавить эти вещи в viewDidLoad () (я добавил подпредставление, чтобы получить доступ к нему в классе):

view.addSubview(pauseButton)
pauseButton.x = -20
pauseButton.y = 20
pauseButton.width = 40
pauseButton.height = 40

Это не обновляет материал, который я указал в init ().Как мне снова вызвать init (без повторного выполнения pauseButton = MenuButton ()) или я могу использовать обновление ()?

Спасибо за вашу помощь;)

Ответы [ 4 ]

0 голосов
/ 24 октября 2018

вы пробовали?

 button.frame = CGRect(x:xPostion, y:yPostion, width:buttonWidth, height:buttonHeight)

или вы можете объявить функцию с именем updateFrame в вашем классе кнопок меню и передать новую позицию в качестве аргумента, например:

func updateFrame(x:CGFloat, y: CGFloat, width: CGFloat, height: CGFloat){
self.frame = CGRect(x:xPostion, y:yPostion, width:buttonWidth, height:buttonHeight)
}

и вваш VideDidLoad:

button.updateFrame(x:xPostion, y:yPostion, width:buttonWidth, height:buttonHeight)

то, что вы делаете в данный момент, это просто присвоение некоторых значений свойствам вашей кнопки, как ваша кнопка знает, как использовать их для сброса своего фрейма ??

0 голосов
/ 24 октября 2018

метод init () вызывается только один раз, когда вы создаете экземпляр своей кнопки.Вы должны попытаться создать экземпляр кнопки с желаемыми свойствами.Попробуйте что-то вроде этого:

let pauseButton = MenuButton(parent: UIView(), x: -20, y: 20, width: 40, height:40)

Тогда в вашем методе viewDidLoad () вы можете получить только эту строку:

view.addSubview(pauseButton)

Еще одна проблема, которую я заметил, заключается в том, что вы ссылаетесь на суперпредставлениев вашем методе init (), но superview в этом случае всегда равно nil, поскольку ваша кнопка еще не добавлена ​​как подпредставление.

0 голосов
/ 24 октября 2018

Вы можете фактически передать эти значения в инициализаторе, как показано ниже:

let pauseButton = MenuButton(parent: view, x: -20, y: 20, width: 40, height: 40)

Если вы хотите, чтобы ваша кнопка обновлялась немедленно при изменении любого из этих свойств, вы можете использовать обратный вызов didSet для установкиframe как показано ниже,

class MenuButton: UIButton {

    var x: CGFloat {
        didSet {
            self.updateFrame()
        }
    }

    var y: CGFloat  {
        didSet {
            self.updateFrame()
        }
    }

    var width: CGFloat  {
        didSet {
            self.updateFrame()
        }
    }

    var height: CGFloat  {
        didSet {
            self.updateFrame()
        }
    }

    private func updateFrame() {
        frame = CGRect(x: x, y: y, width: width, height: height)
    }

    required init(parent: UIView = UIView(), x: CGFloat = 0, y: CGFloat = 0, width: CGFloat = 40, height: CGFloat = 40) {

        self.x = x
        self.y = y
        self.width = width
        self.height = height

        super.init(frame: .zero)

        frame = CGRect(x: x, y: y, width: width, height: height)
        backgroundColor = .green
        setTitleColor(#colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), for: .normal)
        layer.cornerRadius = self.frame.height / 2

        if x < 0 {
            frame = CGRect(x: superview?.frame.width ?? 0 - abs(x) - frame.width, y: frame.minY, width: frame.width, height: frame.height)
        }

        if y < 0 {
            frame = CGRect(x: frame.minX, y: superview?.frame.height ?? 0 - abs(y) - frame.height, width: frame.width, height: frame.height)
        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
0 голосов
/ 24 октября 2018

каждый UIViewController имеет доступ к UIView внутри него как view вы добавляете подпредставление уже здесь.

view.addSubview(pauseButton)

, поэтому просто передайте его в init() и добавьте его туда.

Ваш код может быть примерно таким.

class MenuButton: UIButton {


var x: CGFloat
var y: CGFloat
var width: CGFloat
var height: CGFloat

required init(parent: UIView = UIView(), x: CGFloat = 0, y: CGFloat = 0, width: CGFloat = 40, height: CGFloat = 40) {

    self.x = x
    self.y = y
    self.width = width
    self.height = height

    super.init(frame: .zero)

    frame = CGRect(x: x, y: y, width: width, height: height)
    backgroundColor = global.labelColor
    setTitleColor(#colorLiteral(red: 0, green: 0, blue: 0, alpha: 1), for: .normal)
    layer.cornerRadius = self.frame.height / 2

    if x < 0 {
        frame = CGRect(x: superview?.frame.width ?? 0 - abs(x) - frame.width, y: frame.minY, width: frame.width, height: frame.height)
    }

    if y < 0 {
        frame = CGRect(x: frame.minX, y: superview?.frame.height ?? 0 - abs(y) - frame.height, width: frame.width, height: frame.height)
    }
    parent.addSubview(self)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")


   }
}

И использовать его в ViewDidLoad вот так.

let _ = MenuButton(parent: view, x: -20, y: 20, width: 40, height: 40)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...