在 iOS 14 中以编程方式打开 UIDatePicker

אור*_*hpt 50 uidatepicker uikit swift ios14

我有这个正常UIDatePicker(对不起,它不是英文,请忽略):

我的日期选择器

但问题是它只在我按下日期选择器时出现:

图片

而且我想知道如何仅使用代码显示第一张图像中的日期选择器(它用模糊效果覆盖所有屏幕),因此用户无需按日期选择器来显示日期选择器。谢谢。

Amr*_*med 8

您可以使用带有.compact样式的 datePicker并UILabel在其顶部放置一个并为其设置背景颜色以隐藏其datePicker背后,并确保禁用标签用户交互,然后您应该能够点击 datePicker,它将显示modal 然后更改 datePicker 的值您可以使用自己的日期格式化程序相应地设置标签的文本,您也可以将 datePicker 和标签都放在 a 中UIView并使其剪辑到边界


小智 7

我也有同样的问题。我使用以下黑客:

let datePicker = UIDatePicker(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
datePicker.preferredDatePickerStyle = .compact

// Removes Labels
datePicker.subviews.forEach({ $0.subviews.forEach({ $0.removeFromSuperview() }) })
Run Code Online (Sandbox Code Playgroud)

然后我简单地在视图顶部添加这个日期选择器,它应该打开这个弹出窗口。

  • 感谢您的建议,但我不会将其标记为已接受,因为它没有回答我的所有问题。用户仍然必须按日期选择器才能将其打开。我想要一个解决方案,而不是用户按下,我只用代码来完成。 (7认同)
  • 对我不起作用。 (2认同)

Ado*_*els 7

无法从代码中打开UIDatePickerwithUIKit14

  • UIDatePicker 没有用于执行此操作的 API
  • UIKit不允许我们创建一个UIEventsUITouch其中有任何影响的对象UIKit

  • 我已经创建了赏金,很高兴看到有人向我表明我错了 (2认同)

小智 7

我不知道这是否仍然有效,但是您可以使用.inline新的 UIDatePicker 的样式。然后使用您自己的视图和动画来模仿 DatePicker 的外观.compact

let secondDatePicker = UIDatePicker()
secondDatePicker.preferredDatePickerStyle = .inline
self.view.addSubview(secondDatePicker)

secondDatePicker.translatesAutoresizingMaskIntoConstraints = false
secondDatePicker.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
secondDatePicker.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
Run Code Online (Sandbox Code Playgroud)


Cri*_*tik 6

不幸的是,不可能以编程方式显示日期选择器弹出窗口,至少不会求助于可能导致您的应用被拒绝的黑客:

  • UIDatePicker 控件不公开任何可以通过编程触发的事件sendActions(for:)-allControlEvents返回一个空选项集

  • 以编程方式模拟用户点击在 iOS 上正式是不可能的 - 没有公共 API 来实现这一点,所有解决方法都意味着诉诸私有 API

  • 如果以上还不够,UIDatePicker 的 UI 结构由私有类组成:

    在此处输入图片说明 在此处输入图片说明

结论是,在当前状态下,UIDatePicker只能通过用户交互来控制 UI。也许这会在未来发生变化,例如UIButton's 公开操作以触发与用户点击按钮时相同的行为,因此UIDatePicker将来可能会公开此类操作。


iAu*_*gus 5

更新:这在 iOS 15 上不再适用。

@Amr Mohamed 的答案很聪明,在日期选择器视图上放置一个标签,但这也会导致点击日期选择器视图时出现故障,当日期选择器 vc 动画显示时,您还可以看到日期选择器。

因此,我们需要“隐藏”日期选择器视图,但又保持其交互性。(我们不能只使用isHidden = trueor alpha = 0,否则它就不再可点击了)

这就是我在项目中的做法:

extension UIView {
    func loopDescendantViews(_ closure: (_ subView: UIView) -> Void) {
        for v in subviews {
            closure(v)
            v.loopDescendantViews(closure)
        }
    }
}

let datePicker = UIDatePicker()
datePicker.preferredDatePickerStyle = .compact
datePicker.loopDescendantViews {
    $0.alpha = $0 is UIControl ? 1 : 0
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以将此不可见的日期选择器放在标签/其他视图的顶部。一旦您点击标签(实际上点击了日期选择器),日期选择器 vc 就会动画显示。