Dru*_*man 22 animation uiviewanimation uiviewanimationtransition ios swift
注意:我已经检查了以下堆栈溢出问题:
27907570,32229252,26118141,31604300
我想要做的就是当一个按钮附带的IBAction调用时,在视图中淡化动画(通过alpha).然后在视图上的按钮被击中时反转.
我的皱纹可能是我在故事板视图中使用ViewDock上的辅助视图.视图在viewDidLoad时被添加到子视图中,其中框架/边界设置为与超级视图相同(用于完全停留)
这是作为叠加视图完成的原因,因为它是一个教程指示器.
结果(就像许多其他列出这个问题的人一样)是视图(和包含的控件)只是立即出现并立即消失.没有褪色.
我已尝试使用延迟,带有和不带完成,带有转换的animationWithDuration,甚至以旧的UIView.beginAnimations启动.
什么都行不通.建议热烈欢迎.
代码与我可以做到的一样简单:
编辑:将代码扩展到与
Edit2: TL 相关的所有内容; DR除了UIViewAnimateWithDuration之外,其他任何东西都可以工作,它似乎忽略了块和持续时间,只是直接运行内联代码UI更改.解决这个问题得到了赏金
@IBOutlet var infoDetailView: UIView! // Connected to the view in the SceneDock
override func viewDidLoad() {
super.viewDidLoad()
// Cut other vDL code that isn't relevant
setupInfoView()
}
func setupInfoView() {
infoDetailView.alpha = 0.0
view.addSubview(infoDetailView)
updateInfoViewRect(infoDetailView.superview!.bounds.size)
}
func updateInfoViewRect(size:CGSize) {
let viewRect = CGRect(origin: CGPointZero, size: size)
infoDetailView.frame = viewRect
infoDetailView.bounds = viewRect
infoDetailView.layoutIfNeeded()
infoDetailView.setNeedsDisplay()
}
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
updateInfoViewRect(size)
}
func hideInfoView() {
AFLog.enter(thisClass)
UIView.animateWithDuration(
2.0,
animations:
{
self.infoDetailView.alpha = 0.0
},
completion:
{ (finished) in
return true
}
)
AFLog.exit(thisClass)
}
func showInfoView() {
AFLog.enter(thisClass)
UIView.animateWithDuration(
2.0,
animations:
{
self.infoDetailView.alpha = 0.75
},
completion:
{ (finished) in
return true
}
)
AFLog.exit(thisClass)
}
// MARK: - IBActions
@IBAction func openInfoView(sender: UIButton) {
showInfoView()
}
@IBAction func closeInfoView(sender: UIButton) {
hideInfoView()
}
Run Code Online (Sandbox Code Playgroud)
请注意,我从以下开始:
func showInfoView() {
UIView.animateWithDuration(2.0, animations: { () -> Void in
self.infoDetailView.alpha = 0.75
})
}
func hideInfoView() {
UIView.animateWithDuration(2.0, animations: { () -> Void in
self.infoDetailView.alpha = 0.00
})
}
Run Code Online (Sandbox Code Playgroud)
Dar*_*rko 46
如果infoDetailView处于自动布局约束下,则需要在 animateWithDuration 内的父视图上调用layoutIfNeeded :
func showInfoView() {
self.view.layoutIfNeeded() // call it also here to finish pending layout operations
UIView.animate(withDuration: 2.0, animations: {
self.infoDetailView.alpha = 0.75
self.view.layoutIfNeeded()
})
}
Run Code Online (Sandbox Code Playgroud)
从理论上讲,如果你只是改变了阿尔法值,但是这应该没有必要,也许这可能是在这种情况下的问题.
Sul*_*han 14
我能看到几件奇怪的事情,
首先,删除:
infoDetailView.layoutIfNeeded()
infoDetailView.setNeedsDisplay()
Run Code Online (Sandbox Code Playgroud)
通常您不需要手动调用这些方法,除非您确切知道自己在做什么.
此外,当您更改大小时:
infoDetailView.frame = viewRect
infoDetailView.bounds = viewRect
Run Code Online (Sandbox Code Playgroud)
你永远不需要同时设置bounds
和frame
.刚设置frame
.
此外,您应该通过设置确保视图实际上不会忽略该帧:
infoDetailView.translatesAutoresizingMaskIntoConstraints = true
Run Code Online (Sandbox Code Playgroud)
只需设置自动调整大小掩码,而不是重置帧:
infoDetailView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
Run Code Online (Sandbox Code Playgroud)
导致:
override func viewDidLoad() {
super.viewDidLoad()
// Cut other vDL code that isn't relevant
setupInfoView()
}
func setupInfoView() {
infoDetailView.alpha = 0.0
infoDetailView.translatesAutoresizingMaskIntoConstraints = true
infoDetailView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
infoDetailView.frame = view.bounds
view.addSubview(infoDetailView)
}
func hideInfoView() {
...
}
Run Code Online (Sandbox Code Playgroud)
我认为这实际上应该有所帮助,因为即时动画通常与尺寸问题有关.
如果问题仍然存在,则应检查infoDetailView
动画中的对象infoDetailView
是否与添加到控制器的对象相同.
对于希望在视图加载时立即开始动画的其他人...
如果您调用UIView.animate(...)
inside动画将不起作用viewDidLoad
。相反,它必须从viewDidAppear
函数中调用。
override func viewDidAppear(_ animated: Bool) {
UIView.animate(withDuration: 3) {
self.otherView.frame.origin.x += 500
}
}
Run Code Online (Sandbox Code Playgroud)
小智 1
使用此代码:
雨燕2
UIView.animateWithDuration(0.3, animations: { () -> Void in
self.infoDetailView.alpha = 0.0
})
Run Code Online (Sandbox Code Playgroud)
斯威夫特 3、4、5
UIView.animate(withDuration: 0.3, animations: { () -> Void in
self.infoDetailView.alpha = 0.0
})
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
21348 次 |
最近记录: |