美文网首页
关于“时光便签”的技术详解

关于“时光便签”的技术详解

作者: 惹人 | 来源:发表于2018-09-20 14:00 被阅读0次

                                                                   关于“时光便签”的技术详解  

                                                            作者:Chen  Yu    邮箱:zhiganshunn@yeah.net   

APP使用到了文本编辑器,是利用YYTextView封装的可以多重判断的输入控件,日历控件使用绘图技术绘制,具体技术实现如下:

1.日历是由两部分组成的,一个显示月份的MenuView,一个显示天数的ContentView.

所以我们需要创建两个View

上面的菜单View是我自定义的一个MenuView,并没有使用框架内自带的,因为框架内自带MenuView的没有左右点击切换月份,但是自带的MenuView是一个ScrollView,可以左右滚动进行月份切换,大家可以根据自己需求进行设置

//创建一个管理者,并且通过属性强引用,使其不会被释放

@property (strong, nonatomic) JTCalendarManager *calendarManager;

//通过New语法来创建管理者

self.calendarManager = [JTCalendarManager new];

//改变日历的代理方法

- (void)calendar:(JTCalendarManager *)calendar prepareDayView:(JTCalendarDayView *)dayView

{

    //日期为今天的样式

    if([_calendarManager.dateHelper date:[NSDate date] isTheSameDayThan:dayView.date]){

        dayView.circleView.hidden = NO;

        dayView.circleView.backgroundColor = RGBA(172, 176, 177, 1);

        dayView.dotView.backgroundColor = [UIColor whiteColor];

        dayView.textLabel.textColor = [UIColor whiteColor];

    }

    //日期为选中模式的样式

    else if([self isInDatesSelected:dayView.date]){

        dayView.circleView.hidden = NO;

        dayView.circleView.backgroundColor = RGBA(227, 114, 127, 1);

        dayView.dotView.backgroundColor = [UIColor whiteColor];

        dayView.textLabel.textColor = [UIColor whiteColor];

    }

    //这个为本月内第一个星期里上月日期的样式

    else if(![_calendarManager.dateHelper date:_calendarContentView.date isTheSameMonthThan:dayView.date]){

        dayView.circleView.hidden = YES;

        dayView.dotView.backgroundColor = [UIColor redColor];

        dayView.textLabel.textColor = [UIColor lightGrayColor];

    }

    // 这个为下月内第一个星期里今天的样式

    else{

        dayView.circleView.hidden = YES;

        dayView.dotView.backgroundColor = [UIColor redColor];

        dayView.textLabel.textColor = [UIColor blackColor];

    }

    //日期有事件则显示个小红点,没有就不显示

    if([self haveEventForDay:dayView.date]){

        dayView.dotView.hidden = NO;

    }

    else{

        dayView.dotView.hidden = YES;

    }

}

//通过查看UI图层可以知道显示周的View的类就是JTCalendarWeekDayView,我们就进JTCalendarWeekDayView里面进行修改

//首先查看他的layoutSubviews,因为子控件的布局都在这里

- (void)layoutSubviews

{

    [super layoutSubviews];

    //可以看到他的子控需要的数据都在这个数组里

    if(!_dayViews){

        return;

    }

    CGFloat x = 0;

    CGFloat dayWidth = self.frame.size.width / NUMBER_OF_DAY_BY_WEEK;

    CGFloat dayHeight = self.frame.size.height / 2;

    CGFloat ChineseY = 0;

    CGFloat dayY = self.frame.size.height / 2;

    for(UIView *dayView in _dayViews){

        dayView.frame = CGRectMake(x, dayY, dayWidth, dayHeight);

        x += dayWidth;

    }

}

月份控制我是通过计算月份,然后设置Date刷新数据来实现的,也许有更高的办法,也可以在下方留言。

心率测算采用精准算法,

原理

简单介绍一下,网上可以查到很多关于手机测心率的这种项目,大概就是:把手指放在摄像头和闪光灯上,通过手指处脉搏跳动充血导致的细微颜色变化来确定心跳波动,确定波峰波谷,根据两个波峰之间的时间差来确定瞬时心率。

思路

首先,采集视频流,根据拿到的RGB颜色转成HSV颜色集,其实我们只用到了HSV的H。

对拿到的H进行一些处理,看跟人喜好或者具体情况,主要是用于后面的折线图和计算瞬时心率,如果有能力的话可以处理一下噪音数据,因为可能测的时候手指轻微抖动会造成一些不稳定的数据。

根据处理后的H就可以进行画折线图了,我是把处理后的H和时间戳进行了绑定,用来后面的计算心率。

根据处理后的H来确定波峰波谷,利用两个波谷之间的时间差计算心率。(出处:https://www.jianshu.com/p/9f678e0bdf9b)

核心算法

以上。

相关文章

网友评论

      本文标题:关于“时光便签”的技术详解

      本文链接:https://www.haomeiwen.com/subject/yftnnftx.html