关于“时光便签”的技术详解
作者: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)
核心算法

以上。
网友评论