【发布时间】:2016-07-25 23:55:45
【问题描述】:
注意:我已经检查了以下堆栈溢出问题:
27907570、32229252、26118141、31604300
我想要做的就是当被附加到按钮的 IBAction 调用时,在视图中淡入淡出动画(通过 alpha)。然后在点击视图上的按钮时反转。
我的问题可能是我正在使用情节提要视图的 ViewDock 上的辅助视图。视图在 viewDidLoad 时添加到子视图中,其中框架/边界设置为与父视图相同(用于完全停留)
这是作为一个覆盖视图完成的原因,因为它是一个教程指示器。
结果(与许多列出此问题的其他人一样)是视图(和包含的控件)只是立即出现并立即消失。不会褪色。
我尝试了带有延迟的animationWithDuration,有完成和没有完成,有过渡,甚至从旧的UIView.beginAnimations开始。
没有任何工作。欢迎提出建议。
代码尽可能直截了当:
编辑:将代码扩展到所有相关内容
Edit2: TL;DR Everything与 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()
}
请注意,我从以下开始:
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
})
}
【问题讨论】:
-
"viewDidLoad 时视图被添加到子视图中"
-
FWIW,你可以在这里传递 'nil' 作为完成块。即使您确实有块,它们当然也不应该返回任何东西。我很惊讶 Swift 编译器没有将其标记为错误。
-
@GrahamPerks,我在上面添加了所有相关代码。如原始预调整的失败代码所示,我尝试了有无返回。
-
最后。该视图出现并配置得很好。一切都在它应该在的地方。所有 UI 元素都可以工作,并且旋转会根据约束调整内容。唯一的问题是 alpha 变化不是作为淡入淡出发生的。只是瞬间出现。
-
您的代码看起来正确。当应用程序的其他地方存在线程问题时,我已经看到了这样的意外 UI 行为。尝试在 UIView.animateWithDuration() 和 self.infoDetailView.alpha =... 上放置一个断点...它们都在线程 1 (com.apple.main-thread) 上执行吗?
标签: ios swift uikit uiviewanimation uiviewanimationtransition