我正在尝试制作测验应用程序,我希望它每天早上8:30展示一个新问题,并在下午6点消失。我在网上看到主要的方法是使用计时器,但是我的问题是,如果人更改时区,计时器会不会不同步?还是每天重启?这是我的代码:(请注意,我是初学者)
此外,每当我加载我的应用程序时,问题就会出现一秒钟,然后消失,然后在计时器计时结束后再次出现。
@objc func loadQuestion() {
questionView.alpha = 0
self.view.addSubview(questionView)
questionView.center = self.view.center
questionView.transform = CGAffineTransform.init(scaleX: 1.3, y: 1.3)
UIView.animate(withDuration: 0.4) {
self.visualEffectView.effect = self.effect
self.questionView.alpha = 1
self.questionView.transform = CGAffineTransform.identity
let date = Date().addingTimeInterval(30600)
let timer = Timer(fireAt: date, interval: 0, target: self, selector: #selector(self.loadQuestion), userInfo: nil, repeats: false)
RunLoop.main.add(timer, forMode: .common)
}
}
@objc func loadOutQuestion() {
UIView.animate(withDuration: 0.3, animations: {
self.questionView.transform = CGAffineTransform.init(scaleX: 1.3, y: 1.3)
self.questionView.alpha = 0
self.visualEffectView.effect = nil
let date = Date().addingTimeInterval(64800)
let timer = Timer(fireAt: date, interval: 0, target: self, selector: #selector(self.loadOutQuestion), userInfo: nil, repeats: false)
RunLoop.main.add(timer, forMode: .common)
}) { (succcess:Bool) in
self.questionView.removeFromSuperview()
}
}
答案 0 :(得分:0)
这将从用户的本地时间上午8:30和下午6:00结束。
var calendar = Calendar.current
calendar.timeZone = NSTimeZone.local
let startDate = calendar.startOfDay(for: Date())
let EightAM = calendar.date(byAdding: .hour, value: 8, to: startDate)!
let EightThirtyAM = calendar.date(byAdding: .hour, value: 30, to: EightAM)!
let SixPM = calendar.date(byAdding: .hour, value: 18, to: startDate)!
如果此时未打开该应用,则不会触发任何事情。
在这种情况下,您可以执行的操作是在ViewDidLoad中,选中
if Date() > EightThirtyAM && Date() < SixPM {
showQuiz()
} else {
hideQuiz()
}
如果您希望它在下午6:00点消失,请添加
let timer = Timer(fireAt: SixPM, interval: 0, target: self, selector: #selector(hideQuiz), userInfo: nil, repeats: false)
RunLoop.main.add(timer, forMode: .common)
如果您喜欢component
解决方案,请尝试。
var calendar = Calendar.current
calendar.timeZone = NSTimeZone.local
let hours = calendar.component(.hour, from: Date())
let minutes = calendar.component(.minute, from: Date())
let timeFloat:Float = Float(hours) + Float(minutes)/60
if timeFloat > 8.5 && timeFloat < 18 {
showQuiz
} else {
hideQuiz
}
答案 1 :(得分:0)
您可以使用“ 本地通知”。我放入了苹果示例代码,请检查它,然后您可以根据需要修改示例代码。
配置本地通知的步骤如下:
UNMutableNotificationContent
对象。UNCalendarNotificationTrigger
,UNTimeIntervalNotificationTrigger
或UNLocationNotificationTrigger
对象来描述传递通知的条件。UNNotificationRequest
对象。addNotificationRequest:withCompletionHandler:
方法来安排通知;请参阅安排本地通知的发送时间示例代码
let content = UNMutableNotificationContent()
// Replace "Wake up!" with your "question title"
content.title = NSString.localizedUserNotificationString(forKey: "Wake up!", arguments: nil)
// Replace "Rise and shine! It's morning time!" with your "question description"
content.body = NSString.localizedUserNotificationString(forKey: "Rise and shine! It's morning time!",
arguments: nil)
// Configure the trigger for a 7am wakeup.
var dateInfo = DateComponents()
dateInfo.hour = 7
dateInfo.minute = 0
let trigger = UNCalendarNotificationTrigger(dateMatching: dateInfo, repeats: false)
// Create the request object.
let request = UNNotificationRequest(identifier: "MorningAlarm", content: content, trigger: trigger)
答案 2 :(得分:0)
这是我到目前为止所拥有的。我不知道我是否距离解决此问题越来越近
@objc func loadQuestion() {
self.view.addSubview(questionView)
questionView.center = self.view.center
questionView.transform = CGAffineTransform.init(scaleX: 1.3, y: 1.3)
questionView.alpha = 0
var dateComponents = DateComponents()
dateComponents.hour = 08
dateComponents.minute = 30
let currentTime = DateComponents()
let hour = currentTime.hour
let minute = currentTime.minute
var calendar = Calendar.current
calendar.timeZone = NSTimeZone.local
if hour >= dateComponents {
UIView.animate(withDuration: 0.4) {
self.visualEffectView.effect = self.effect
self.questionView.alpha = 1
self.questionView.transform = CGAffineTransform.identity
}
}
}