zoukankan      html  css  js  c++  java
  • IOS小组件(6):小组件实现时钟按秒刷新

    引言

      上一节中我们了解了IOS小组件的刷新机制,发现根本没法实现按秒刷新,但是看别的App里面有做到,以为用了什么黑科技,原来是因为系统提供了一个额外的机制实现时间的动态更新,不用走小组件的刷新机制。

    Text控件支持显示日期时间,下面是来自官网的代码

    计算时间差

    let components = DateComponents(minute: 11, second: 14)
    let futureDate = Calendar.current.date(byAdding: components, to: Date())!
    
    Text(futureDate, style: .relative)
    // Displays:
    // 11 min, 14 sec
    
    Text(futureDate, style: .offset)
    // Displays:
    // -11 minutes
    

      使用relative样式可以显示当前日期和时间与指定日期之间的差值(绝对值),而不管该日期是将来的还是过去的日期。使用offset样式显示当前日期和时间与指定日期之间的时差,表示将来的日期带有减号(-)前缀,而过去的日期带有加号(+)前缀。

    倒计时和计时器

    let components = DateComponents(minute: 15)
    let futureDate = Calendar.current.date(byAdding: components, to: Date())!
    
    Text(futureDate, style: .timer)
    // Displays:
    // 15:00
    

      对于将来的日期,timer样式将递减计数(倒计时),直到当前时间达到指定的日期和时间为止,并在日期经过时递增计数(计时器)。

    显示绝对日期或时间

    // Absolute Date or Time
    let components = DateComponents(year: 2020, month: 4, day: 1, hour: 9, minute: 41)
    let aprilFirstDate = Calendar.current(components)!
    
    Text(aprilFirstDate, style: .date)
    Text("Date: (aprilFirstDate, style: .date)")
    Text("Time: (aprilFirstDate, style: .time)")
    
    // Displays:
    // April 1, 2020
    // Date: April 1, 2020
    // Time: 9:41AM
    

    显示两个日期之间的时间间隔

    let startComponents = DateComponents(hour: 9, minute: 30)
    let startDate = Calendar.current.date(from: startComponents)!
    
    let endComponents = DateComponents(hour: 14, minute: 45)
    let endDate = Calendar.current.date(from: endComponents)!
    
    Text(startDate ... endDate)
    Text("The meeting will take place: (startDate ... endDate)")
    
    // Displays:
    // 9:30AM-2:45PM
    // The meeting will take place: 9:30AM-2:45PM
    

    实现一天时间的计时器

      使用 style: .time样式,如果当前的时间比指定的时间大,则时间就会累计。基于这个原理,我们只需要把时间起点定在每天的0点即可,根据当前的时间计算出今天的开始时间。以下方法可以根据12,24小时制度,获取当天起点时间。

     //获取当天开始的日期,给Date增加一个拓展方法
     extension Date {
        func getCurrentDayStart(_ isDayOf24Hours: Bool)-> Date {
            let calendar:Calendar = Calendar.current;
            let year = calendar.component(.year, from: self);
            let month = calendar.component(.month, from: self);
            let day = calendar.component(.day, from: self);
        
            let components = DateComponents(year: year, month: month, day: day, hour: 0, minute: 0, second: 0)
            return Calendar.current.date(from: components)!
        }
    }
    // 实现一天内的计时器
    Text(Date().getCurrentDayStart(true), style: .timer)
    

    结语

      通过IOS Text控件我们实现了按秒刷新的计时器,所以数字时钟的按秒刷新算是解决了,但是怎么实现表盘时钟的秒针360度旋转呢?如果让秒针精确的对应当前的时间,应该做不到了。后面再继续研究,如果有解决方案的可以贡献一下,感谢。

  • 相关阅读:
    BestCoder17 1001.Chessboard(hdu 5100) 解题报告
    codeforces 485A.Factory 解题报告
    codeforces 485B Valuable Resources 解题报告
    BestCoder16 1002.Revenge of LIS II(hdu 5087) 解题报告
    codeforces 374A Inna and Pink Pony 解题报告
    codeforces 483B Friends and Presents 解题报告
    BestCoder15 1002.Instruction(hdu 5083) 解题报告
    codeforces 483C.Diverse Permutation 解题报告
    codeforces 483A. Counterexample 解题报告
    NSArray中地内存管理 理解
  • 原文地址:https://www.cnblogs.com/popfisher/p/14767333.html
Copyright © 2011-2022 走看看