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 的子类,受限于父视图。
_iconView
是UIImageView
animateIn
保证在animateOut
之前运行
animateOut
是没有按预期工作的函数,animateIn
工作
【问题讨论】:
我认为您忘记了这样一个事实,即因为您在动画“s”之前将宽度减半实际上等于您认为的一半(原始尺寸)。所以它只恢复到您期望的一半大小_iconView
是 UIImageView
,带有“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 框架未按预期设置动画(大小和原点)的主要内容,如果未能解决你的问题,请参考以下文章