StackView 中的动画 DatePicker hide/show

Animate DatePicker hide/show in StackView

如何在 stackView 中正确设置 datePicker appearance/disappearance 的动画?目前我这样试过:

UIView.animateWithDuration(0.3, animations: {
    self.datePickerView.hidden = !self.datePickerView.hidden
})

这会导致隐藏动画出现问题 - 它很好地开始,然后最后 datePickerView 在 datePicker 所在的顶部闪烁了一点。有什么建议吗?

我遇到了同样的问题并通过这种方式解决了:

  • 将您的 Picker 放在一个视图中(我们称之为 pickerContainerView)
  • 为您的 pickerContainerView 设置 216 高度限制(选择器默认高度)
  • 将约束优先级设置为 999 以安静 "UISV-hiding" 约束警告
  • 将选择器的 "leading"、"trailing" 和 "center vertically" 约束添加到 pickerContainerView
  • pickerContainerView 的动画隐藏:

Swift 2

UIView.animateWithDuration(0.3, animations: {
    self.pickerContainerView.hidden = !self.pickerContainerView.hidden
})

Swift 3, 4, 5

UIView.animate(withDuration: 0.3, animations: {
    self.pickerContainerView.isHidden = !self.pickerContainerView.isHidden
})

使用容器来容纳选择器并设置 clipsToBounds = true 对我有用。

我正在使用 PureLayout,但它应该也适用于 IB。

startRangePickerContainer = UIView()
startRangePickerContainer.clipsToBounds = true
startRangePickerContainer.backgroundColor = UIColor.cyan
stackView.addArrangedSubview(startRangePickerContainer)
startRangePickerContainer.autoPinEdge(toSuperviewEdge: .leading)
startRangePickerContainer.autoSetDimension(.height, toSize: 216)
startRangePickerContainer.autoPinEdge(toSuperviewEdge: .leading)
startRangePickerContainer.autoPinEdge(toSuperviewEdge: .trailing)

startRangePicker = UIDatePicker()
startRangePickerContainer.addSubview(startRangePicker)
startRangePicker.autoCenterInSuperview()

动画:

UIView.animate(withDuration: 0.3, animations: {
    self.startRangePickerContainer.isHidden = !self.startRangePickerContainer.isHidden
})