Как создать несколько ярлыков без их исчезновения сразу? - PullRequest
0 голосов
/ 19 мая 2018

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

Моя проблема заключается в том, что не удается создать несколькоярлыки, потому что он удаляет ярлык слишком рано, потому что он удаляет все с именем label.

Как я могу это исправить, так что он создает несколько ярлыков, которые удаляются только тогда, когда ярлык по отдельности завершает свою анимацию?

Решение, о котором я думал, но не могу понять, - это где вы можете создать ярлык с другим именем, таким как label1, label2 и т. Д., Чтобы он могудалить определенную метку после завершения анимации вместо удаления всех.

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 100))

func createLabel() {

    // Find the button's width and height
    let labelWidth = label.frame.width

    // Find the width and height of the enclosing view
    let viewWidth = self.view.frame.width

    // Compute width and height of the area to contain the button's center
    let xwidth = viewWidth - labelWidth

    // Generate a random x and y offset
    let xoffset = CGFloat(arc4random_uniform(UInt32(xwidth)))

    // Offset the button's center by the random offsets.
    label.center.x = xoffset + labelWidth / 2
    label.center.y = 300

    label.font = UIFont(name:"Riffic Free", size: 18.0)
    label.textColor = UIColor.white
    label.textAlignment = .center
    label.text = "+1"
    self.view.addSubview(label)
}

func clearLabel() {
    UIView.animate(withDuration: 0.9, delay: 0.4, usingSpringWithDamping: 1.0, initialSpringVelocity: 0.0, options: .curveLinear, animations: {

        self.label.center = CGPoint(x: 265, y: 75 )

    }, completion: { (finished: Bool) in
        self.label.removeFromSuperview()
    })
}

@IBAction func clicked(_ sender: Any) {
    createLabel()
    clearLabel()
}

1 Ответ

0 голосов
/ 19 мая 2018

Проблема с этим кодом:

@IBAction func clicked(_ sender: Any) {
    createLabel()
    clearLabel()
}

Есть две проблемы.Во-первых, вы делаете анимацию и удаление еще до того, как даете метке шанс стать частью интерфейса.Вам нужно ввести задержку (вы можете использовать мою delay утилиту, https://stackoverflow.com/a/24318861/341994):

@IBAction func clicked(_ sender: Any) {
    createLabel()
    delay(0.1) {
        clearLabel()
    }
}

Вторая проблема, как вы правильно сказали, состоит в том, что у вас есть одна label переменная экземпляра, котораявы используете, чтобы разделить метку между createLabel и clearLabel. Таким образом, другая метка не может появиться во время анимации.

Но на самом деле не нужна любая переменная экземпляра.полностью избавьтесь от вашего объявления label Вместо этого измените createLabel так, чтобы он на самом деле создал метку (то есть вызывает UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 100))) как локальную переменную, а затем возвращает ссылку на метку, которую он создает, например:

func createLabel() -> UILabel {
    let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    // ...
    return label
}

... И затем просто clearLabel принимает эту такую ​​же метку как параметр , чтобы он перемещал эту метку и удалял ее в конце анимации, например:

func clearLabel(_ label : UILabel) {
    // ...
}

Ваша реализация clicked будет выглядеть следующим образом, передавая метку из createLabel и в clearLabel:

@IBAction func clicked(_ sender: Any) {
    let label = self.createLabel()
    delay(0.1) {
        self.clearLabel(label)
    }
}

(Остальные детали модификации createLabel и clearLabel для выполнения этой работы оставлены читателю в качестве упражнения.)

Теперь каждое нажатие на кнопку создает и анимирует и удаляет новый ярлык, независимо от того, что еще могло случиться раньше.

enter image description here

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