UIImageView 框架未按预期设置动画(大小和原点)

Posted

技术标签:

【中文标题】UIImageView 框架未按预期设置动画(大小和原点)【英文标题】:UIImageView frame not animating as expected (size and origin) 【发布时间】:2018-02-15 02:53:27 【问题描述】:

遇到了 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。 【参考方案1】:

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

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

    因为 _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 相关的代码来解决它。我不知道为什么它首先被调用。

【讨论】:

以上是关于UIImageView 框架未按预期设置动画(大小和原点)的主要内容,如果未能解决你的问题,请参考以下文章

动画未按预期工作[重复]

反应 onLoad img 事件未按预期工作

iOS Storyboard 约束未按预期运行

UIScrollView ContentSize 未按预期运行

在位置之前为 UILabel 尺寸设置动画

CollectionView estimatedItemSize 未按预期工作