UIImageView框架没有按预期动画(大小和原点)

时间:2017-09-06 14:43:43

标签: ios swift animation uiview uiviewanimation

使用UIView帧动画遇到问题。视图应在原点和大小两者中设置动画,大小增加,原点线性移动以使视图保持在同一位置。但是会发生什么,视图减小到大小(0,0),然后增加到仍然不正确的大小。见附件视频。

问题视频:https://media.pairby.com/I/u/a/IualExcJXn7CqLsGkcNZfwyEw5MKi3SV/v.mp4

func animateIn() {
  // Make _iconView large
  let w = bounds.width
  _iconView.frame = CGRect(
    x: frame.midX - w/2,
    y: frame.midY - w/2,
    width: w, height: w)

  isHidden = false

  UIView.animate(withDuration: 0.2, animations: {
    self.alpha = 1

    // Animate it smaller
    let w = self.bounds.width * 0.5
    self._iconView.frame = CGRect(
      x: self.frame.midX - w/2,
      y: self.frame.midY - w/2,
      width: w, height: w)
  })
}

func animateOut() {
  UIView.animate(withDuration: 3, delay: 0, options: .beginFromCurrentState, animations: {
    self.alpha = 0

    // Make it large again
    let w = self.bounds.width
    self._iconView.frame = CGRect(
      x: self.frame.midX - w/2,
      y: self.frame.midY - w/2,
      width: w, height: w)

  }, completion: { _ in self.isHidden = true })
}

更多详情:

self是UIView的子类,受限于超级视图。

_iconViewUIImageView

animateIn保证在animateOut

之前运行

animateOut功能无法正常工作,animateIn正常工作

2 个答案:

答案 0 :(得分:0)

不完全清楚你需要做什么,但是......

  1. 您无需更改大小即可 - 您只需从当前状态动画_iconView框架,

  2. 因为_iconView是self子视图,您需要相对于边界而不是框架定位它。

  3. 试试这样:

    func doAnim() -> Void {     
    
        UIView.animate(withDuration: 3, delay: 0, options: .beginFromCurrentState, animations: {
            self.alpha = 0
    
            let s = self.bounds.width
            let halfS = s / 2
    
            self._iconView.frame = CGRect(
                x: self.bounds.midX - halfS,
                y: self.bounds.midY - halfS,
                width: s,
                height: s)
    
        })
    
    }
    

答案 1 :(得分:0)

通过从_iconView函数中删除所有layoutSubviews()相关代码来解决此问题。我不确定为什么它首先被调用。