Фоновая анимация Swift Uiview не работает - PullRequest
1 голос
/ 10 июля 2020

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

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

это мой код

let fullView: CGFloat = 0
let screenSize: CGRect = UIScreen.main.bounds

@IBOutlet weak var Text: UILabel!
@IBOutlet weak var topView: UIView!
@IBOutlet weak var vieww: UIView!
@IBOutlet weak var botView: UIView!
@IBOutlet weak var Button: UIButton!

@objc func pressed(sender : Any) {
    
    var closeView = screenSize.height
   
    print(closeView)
    
    UIView.animate(withDuration: 0.4) { [weak self] in
        let frame = self?.view.frame
         self?.view.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
        self?.view.frame = CGRect(x: 0, y: closeView, width: frame!.width, height: frame!.height)
    }
    
    UIView.animate(withDuration: 0.4, delay: 0.35, options: .curveEaseOut, animations: {
        self.topView.alpha = 0.0
    }, completion: nil)
    
    isShown = false

}

override func viewDidLoad() {
    super.viewDidLoad()
    
    button()
   
    self.topView.alpha = 0.0
    
    vieww.layer.cornerRadius = 20
    vieww.layer.borderWidth = 0.5
    vieww.layer.borderColor = UIColor(red:222/255, green:225/255, blue:227/255, alpha: 1).cgColor
    vieww.clipsToBounds = true
    
    botView.layer.masksToBounds = false
    botView.layer.shadowColor = UIColor.black.cgColor
    botView.layer.shadowOpacity = 0.14
    botView.layer.shadowOffset = CGSize(width: 0, height: 0)
    botView.layer.shadowRadius = 2.7
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    
    
    //when the animation is popping up
    
    UIView.animate(withDuration: 0.4) { [weak self] in
        let frame = self?.view.frame
        //            let yComponent = UIScreen.main.bounds.height - 896
        let yComponent = self?.fullView
        self?.view.frame = CGRect(x: 0, y: yComponent!, width: frame!.width, height: frame!.height)
    }
        
        UIView.animate(withDuration: 0.4, delay: 0.35, options: .curveEaseOut, animations: {
            self.topView.alpha = 0.5
        }, completion: nil)

}

func button() {
    
    Button.addTarget(self, action: #selector(pressed), for: .touchUpInside)
}

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

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Проблема в вашем нажатом методе -

Вы изменяете фрейм основного представления, предоставляя y = closeView (который является размером высоты экрана). Ваше всплывающее окно перемещается по мере того, как весь ваш основной вид опускается.

topView также смещается вниз с основным видом

@objc func pressed(sender : Any) {
  
  let closeView = screenSize.height
 
  print(closeView)
  
  UIView.animate(withDuration: 0.4) { [weak self] in
      let frame = self?.view.frame
       self?.view.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)
      self?.view.frame = CGRect(x: 0, y: closeView, width: frame!.width, height: frame!.height) //Wrong
  }


UIView.animate(withDuration: 0.4, delay: 0.35, options: .curveEaseOut, animations: {
      self.topView.alpha = 0.0
  }, completion: nil)
  

}

Решение -

self?.<bottomView>.frame = CGRect(x: 0, y: closeView, width: frame!.width, height: frame!.height) //Change bottom view with the bottom subview object which you want to push at bottom
0 голосов
/ 10 июля 2020

Вам нужно использовать обработчик завершения, чтобы скрыть такое представление

 UIView.animateKeyframes(withDuration: 0.4, delay: 0.35, options: .curveEaseOut, animations: {
       self.topView.alpha = 0.0
    }) { _ in
      isShown = false
    }
...