Просмотр анимации с неправильной позиции - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь анимировать вид обложки в моем коде.По сути, крышка сдвигается вверх (закрывается) от экрана к экрану, и после того, как пользователь нажимает кнопку, крышка сдвигается вниз (открывается вверх) до конца экрана.

Мой код для перемещениякрышка вид на экран и в поле зрения работает отлично.Тем не менее, код для скольжения обложки вид вниз по экрану и вне поля зрения не работает!Начальная позиция скольжения крышки - это то, что кажется неправильным.Обложка сдвигается вниз, как и ожидалось, но начинается слишком высоко, так что анимация заканчивается там, где она должна начинаться.

У меня есть экранная запись об ошибке в действии (очевидно, замедлилась анимация, чтобы вы моглипосмотрите, что я имею в виду под ошибкой).Крышка, скользящая вниз, должна скользить вниз от своего первоначального положения, до которого она сдвинулась. Ссылка на запись .

Может кто-нибудь определить, где я ошибаюсь в своем коде?

func showScoresCover() {
    verticalDistance = ScoresCoverView.frame.size.height
    self.ScoresCoverView.frame.origin.y += verticalDistance
    UIView.animate(
        withDuration: 0.5,
        delay: 0.25,
        options: .curveEaseOut,
        animations:
        { self.ScoresCoverView.frame.origin.y -= self.verticalDistance},
        completion:
        { finished in
          print("Score cover closed.")
        })
}

func hideScoresCover() {
    verticalDistance = ScoresCoverView.frame.size.height
    UIView.animate(
        withDuration: 0.5,
        delay: 0.25,
        options: .curveEaseIn,
        animations:
        { self.ScoresCoverView.frame.origin.y += self.verticalDistance},
        completion:
        { finished in
          print("Score cover opened.")
        })
}

РЕДАКТИРОВАТЬ

эй @ Nickolans спасибо заВаша помощь в этом вопросе.Итак ... У меня есть странное обновление для вас по этому запросу.Я реализовал ваш код, и он работает, если у меня есть предварительно запрограммированная кнопка, которая запускает showScoreCover и hideScoresCover.Оказывается, даже мой оригинальный код работает, но опять же, только если у меня есть предварительно запрограммированная кнопка, которая запускает функции показать / скрыть.

Однако мне нужно запустить функцию, используя кнопку, где я программно перенастраиваюкнопка делает.Я реализовал это с помощью .addTarget и нескольких селекторов, и эти селекторы будут отличаться в зависимости от того, где в игре находятся пользователи.

В любом случае, мой код выглядит так:

self.continueButton.addTarget(self, action: #selector(self.hideScoresCover), for: UIControlEvents.touchUpInside)
self.continueButton.addTarget(self, action: #selector(self.startTeamB), for: UIControlEvents.touchUpInside)

Первоначально я использовал только один .addTarget и включил hideScoresCover () в функцию startTeamB.Это привело к оригинальной проблеме, где крышка не скрывается правильно (начинается слишком высоко на экране).Поэтому я разделил его на две вышеупомянутые .addTargets, и это также приводит к той же проблеме.ОДНАКО, если я закомментирую всю строку .addTarget выше, относящуюся к селектору startTeamB, и оставлю селектор относящимся к hideScoresCover, то крышка будет показана и скрыта абсолютно, как я хочу, анимация идеальна.Это означает, что лежащий в основе код в hideScoresCover () работает нормально, но проблема заключается в том, что каким-то образом возникает проблема при запуске hideScoresCover при нажатии кнопки продолжения.

У вас есть идея, почему это так?каким-то образом эта цель continueButton запускается некорректно всякий раз, когда есть две addTargets, или когда есть только одна цель, но hideScoresCover () включен в startTeamB ().

Я озадачен, почему это будет иметь место.startTeamB () вообще не является сложной функцией, поэтому не должна мешать hideScoresCover ().Таким образом, это приводит меня только к выводу, что метод continueButton должен запускать hideScoresCover (), когда он либо является отдельной целью в дополнение к тому, что startTeamB является целью, либо когда hideScoresCover () включен в сам startTeamB.Необычно, что он работает правильно, когда единственным .addTarget является селектор, вызывающий hidesScoresCover?

@objc func startTeamB() {
    self.UpdateTeam() //Just changes the team name
    self.TeamBTimer() //Starts a timer to countdown teamB's remaining time
    self.TeamAIndicator.isHidden = true //Just hides teamA image
    self.TeamBIndicator.isHidden = false //Just shows teamB image
    print("Hintify: ","-----Start Team B.")
}

Ответы [ 2 ]

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

Я просто хочу сказать одну вещь, может быть, += здесь не нужен.

func showScoresCover() {
verticalDistance = ScoresCoverView.frame.size.height
self.ScoresCoverView.frame.origin.y += verticalDistance
UIView.animate(
    withDuration: 0.5,
    delay: 0.25,
    options: .curveEaseOut,
    animations:
    { self.ScoresCoverView.frame.origin.y -= self.verticalDistance},
    completion:
    { finished in
      print("Score cover closed.")
    })
}

должно быть

   `self.ScoresCoverView.frame.origin.y = verticalDistance`
0 голосов
/ 16 февраля 2019

Я взял его в Xcode и сам установил.Я полагаю, что проблема может заключаться в том, как вы изменяете свое значение Y, вместо того, чтобы изменять исходную точку, измените положение слоев представления y.

Следующий код работает, так что вы можете просто взять его!Обязательно измените фрейм на тот, который вам нужен при первом запуске.

class ViewController: UIViewController {

//Bool to keep track if view is open
var isOpen = false

var verticalDistance: CGFloat = 0
var ScoresCoverView = UIView()
var button = UIButton()

override func viewDidLoad() {

    //Setup Score view
    ScoresCoverView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.width)
    ScoresCoverView.backgroundColor = .blue
    view.addSubview(ScoresCoverView)

    //Set vertical distance
    verticalDistance = ScoresCoverView.frame.height

    //TEST button to test view animations
    button.frame = CGRect(x: 200, y: 500, width: 100, height: 100)
    button.backgroundColor = .purple
    button.addTarget(self, action: #selector(hasBeenFired), for: .touchUpInside)
    self.view.addSubview(button)
}

//When button pressed
@objc func hasBeenFired() {
    if isOpen {
        self.hideScoresCover()
        self.isOpen = false
    } else {
        self.showScoresCover()
        self.isOpen = true
    }
}

//Show
func showScoresCover() {

    self.ScoresCoverView.isHidden = false

    UIView.animate(withDuration: 0.5, delay: 0.25, options: .curveEaseOut, animations: {
        self.ScoresCoverView.layer.position.y -= self.verticalDistance
    }) { (finished) in
        print("Score cover closed.")
    }
}

//Hide
func hideScoresCover() {

    UIView.animate(withDuration: 0.5, delay: 0.25, options: .curveEaseIn, animations: {
        self.ScoresCoverView.layer.position.y += self.verticalDistance
    }) { (finished) in
        self.ScoresCoverView.isHidden = true
        print("Score cover Opened.")
    }
}
}

РЕДАКТИРОВАТЬ

Если вы хотите изменить функциональностькнопку, не забудьте удалить предыдущую цель перед добавлением новой.

Например, если вы хотите переключиться с показа / скрытия на teamB удалить показать / скрыть и добавить teamB-- и наоборот.

При первом запуске добавьте свою начальную цель:

self.continueButton.addTarget(self, action: #selector(self.hideScoresCover), for: UIControlEvents.touchUpInside)

Переключитесь на startTeamB:

self.continueButton.removeTarget(self, action: #selector(self.hideScoresCover), for: UIControlEvents.touchUpInside)
self.continueButton.addTarget(self, action: #selector(self.startTeamB), for: UIControlEvents.touchUpInside)

Переключиться на hideScoreCover:

self.continueButton.removeTarget(self, action: #selector(self.startTeamB), for: UIControlEvents.touchUpInside)
self.continueButton.addTarget(self, action: #selector(self.hideScoresCover), for: UIControlEvents.touchUpInside)
...