【问题标题】:UIImageView frame not animating as expected (size and origin)UIImageView 框架未按预期设置动画(大小和原点)
【发布时间】:2023-04-06 23:39:02
【问题描述】:

遇到了 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 工作

【问题讨论】:

  • 我认为您忘记了这样一个事实,即因为您在动画“s”之前将宽度减半实际上等于您认为的一半(原始尺寸)。所以它只恢复到您期望的一半大小
  • _iconViewUIImageView,带有“X”图像吗? self 是“主视图”还是子类 UIView?您是否试图将 X “增长”到视图的全宽,并使其淡出透明?
  • 嘿,@torinpitchers。我没有将超级视图(自我)的宽度减半。我在计算时使用超级视图的边界。
  • @DonMag 我在原帖中添加了更多细节。 self 是 UIView 的子类,_iconView 是 UIImageView。

标签: ios swift animation uiview uiviewanimation


【解决方案1】:

目前还不清楚你需要做什么,但是......

  1. 您无需更改开始的大小 - 您可以简单地将 _iconView 框架从其当前状态设置为动画,并且

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

试试这样:

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)

    })

}

【讨论】:

    【解决方案2】:

    通过从layoutSubviews() 函数中删除所有与_iconView 相关的代码来解决它。我不知道为什么它首先被调用。

    【讨论】:

      猜你喜欢
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 2015-07-28
      • 2021-07-21
      • 2011-02-11
      • 1970-01-01
      • 2016-03-21
      相关资源
      最近更新 更多