一個24小時天氣折線圖(仿墨跡天氣)

前一陣看了墨跡天氣的24小時折線圖魁衙,感覺很有意思。尤其是里面View跟著手指的滑動一起實時運動蜈彼,效果體驗很好。 就嘗試寫了一下俺驶,先看一下最終的效果圖:


寫這個折線圖幸逆,讓曲線可滑動難點不大。直接在UIScrollView上面繪制就好了暮现,主要是這個圓角View的運動軌跡計算还绘。 計算運動軌跡,無非就是計算x和y軸的坐標栖袋。下面說下我的計算思路

1.運動坐標分為x和y坐標拍顷。我們先來計算x的運動坐標。通過比例關(guān)系塘幅,很容易得出以下公式

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGSize size = scrollView.contentSize;
    CGFloat x = (_dataArray.count - 1) * self.lineSpace * scrollView.contentOffset.x / (size.width - scrollView.width) + self.leftMargin;
}

其中dataArray為數(shù)據(jù)源數(shù)組, lineSpace為每個點之間的距離,leftMargin為曲線的外邊距昔案。
2.由于曲線本身就是有無數(shù)個直線所組成。我們可以通過直線的方法來處理計算曲線上點的坐標电媳。在求出實時運動軌跡的x點坐標后踏揣,下來我們來計算y坐標:

  • 計算貝塞爾曲線這個點的前后兩點的在位置數(shù)組位置的下標
  • 得到兩點后,問題就變得很簡單了匾乓。直線方程求解
  • 求出斜率捞稿, 通過點斜式計算得出。點斜式公式:y-y1 = k(x - x1)
-(CGFloat)getLableyAxisWithX:(CGFloat)xAxis;
{
    CGPoint startPoint,endPoint;
    NSInteger index;
    CGFloat sum = self.leftMargin;
    for (index = 0; index < _dataArray.count; index++)
    {
        sum += self.lineSpace;
        if (xAxis < sum)
        {
            startPoint = CGPointMake(_modelPostionArray[index].xPosition, _modelPostionArray[index].yPosition);
            _currentIndex = index;
            break;
        }
    }
    endPoint = CGPointMake(_modelPostionArray[index+1].xPosition, _modelPostionArray[index+1].yPosition);
    CGFloat k = (endPoint.y - startPoint.y) / (endPoint.x -startPoint.x);
    CGFloat y = k *(xAxis - startPoint.x) + startPoint.y;
    return y;
}

3.關(guān)于這個圓角箭頭的View拼缝,我們也是通過貝塞爾曲線繪制得出
娱局,圓角計算一下四個圓角的相應(yīng)角度即可。?


-(void)addCirLayer
{
    self.lineLayer = [CAShapeLayer layer];
    self.lineLayer.strokeColor = [UIColor clearColor].CGColor;
    self.lineLayer.fillColor = [[UIColor whiteColor] CGColor];
    self.lineLayer.lineWidth = 1;
    self.lineLayer.contentsScale = [UIScreen mainScreen].scale;
    [self.layer addSublayer:self.lineLayer];
    
    CGSize size = self.size;
    UIBezierPath *path = [UIBezierPath bezierPath];
    double offsetH = size.height - RADIUS*2 - AllowSize.height;
    double offsetW = (size.width - RADIUS*2)/2;
    CGPoint point = CGPointMake(RADIUS, 0);
    [path moveToPoint:point];
    point.x += size.width - RADIUS*2;
    point.y += RADIUS;
    [path addArcWithCenter:point radius:RADIUS startAngle:M_PI*3/2 endAngle:0 clockwise:YES];
    point.x += RADIUS;
    point.y += offsetH;
    [path addLineToPoint:point];
    point.x -= RADIUS;
    [path addArcWithCenter:point radius:RADIUS startAngle:0 endAngle:M_PI/2 clockwise:YES];
    point.y += RADIUS;
    point.x -= offsetW;
    [path addLineToPoint:point];
    point.x -= AllowSize.width/2;
    point.y += AllowSize.height;
    [path addLineToPoint:point];
    point.x -= AllowSize.width/2;
    point.y -= AllowSize.height;
    [path addLineToPoint:point];
    point.x-= offsetW;
    [path addLineToPoint:point];
    point.y -= RADIUS;
    [path addArcWithCenter:point radius:RADIUS startAngle:M_PI/2 endAngle:M_PI clockwise:YES];
    point.x -= RADIUS;
    point.y -= offsetH;
    [path addLineToPoint:point];
    point.x += RADIUS;
    [path addArcWithCenter:point radius:RADIUS startAngle:M_PI endAngle:M_PI*3/2 clockwise:YES];
    [path closePath];
    self.lineLayer.path = path.CGPath;
}

4.關(guān)于光滑貝塞爾曲線的繪制
1.可以通過數(shù)學插值計算得出;
2.也可以通過計算兩個控制點繪制得出珍促。這里的繪制方法借鑒的是一位網(wǎng)上一位大牛的方法铃辖,其選擇的是第二種方法。

-(void)addCurveToPoint:(CGPoint)endPoint controlPoint1:(CGPoint)controlPoint1 controlPoint2:(CGPoint)controlPoint2

寫到最后

1.Github地址點我下載
2.如果覺得還不錯猪叙,給個小星星吧(O(∩_∩)O~~)
3.如果有更好的思路娇斩,歡迎給我簡書留言?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仁卷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子犬第,更是在濱河造成了極大的恐慌锦积,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歉嗓,死亡現(xiàn)場離奇詭異丰介,居然都是意外死亡,警方通過查閱死者的電腦和手機鉴分,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門哮幢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人志珍,你說我怎么就攤上這事橙垢。” “怎么了伦糯?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵柜某,是天一觀的道長。 經(jīng)常有香客問我敛纲,道長喂击,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任淤翔,我火速辦了婚禮翰绊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘办铡。我一直安慰自己辞做,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布寡具。 她就那樣靜靜地躺著秤茅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪童叠。 梳的紋絲不亂的頭發(fā)上框喳,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音厦坛,去河邊找鬼五垮。 笑死,一個胖子當著我的面吹牛杜秸,可吹牛的內(nèi)容都是我干的放仗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼撬碟,長吁一口氣:“原來是場噩夢啊……” “哼诞挨!你這毒婦竟也來了莉撇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤惶傻,失蹤者是張志新(化名)和其女友劉穎棍郎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體银室,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡涂佃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜈敢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辜荠。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扶认,靈堂內(nèi)的尸體忽然破棺而出侨拦,到底是詐尸還是另有隱情,我是刑警寧澤辐宾,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站膨蛮,受9級特大地震影響叠纹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜敞葛,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一誉察、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惹谐,春花似錦持偏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至怎囚,卻和暖如春卿叽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恳守。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工考婴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人催烘。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓沥阱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伊群。 傳聞我的和親對象是個殘疾皇子考杉,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一:canvas簡介 1.1什么是canvas策精? ①:canvas是HTML5提供的一種新標簽 ②:HTML5 ...
    GreenHand1閱讀 4,681評論 2 32
  • 轉(zhuǎn)載請聲明 原文鏈接 關(guān)注公眾號獲取更多資訊 這篇文章主要總結(jié)H5的一些新增的功能以及一些基礎(chǔ)歸納,這里只是一個提...
    程序員poetry閱讀 9,071評論 22 225
  • 前言 本文主要從運營角度重點對近期酷狗的公交站廣告投放活動進行分析奔则,同時結(jié)合網(wǎng)易云音樂近期的運營動作蛮寂,對兩...
    PM小森閱讀 8,797評論 14 7
  • 嘿,親愛的薄姑娘: 我們就要畢業(yè)了易茬。以前總把時光比作白駒過隙酬蹋,沒心沒肺開著玩笑,沒想到轉(zhuǎn)眼之間你我已經(jīng)走過三年多的...
    普通先生閱讀 239評論 2 1
  • 昨天我在回宿舍的地鐵上抽莱,坐到中途的時候范抓,上來了一對父子。當時的我是坐著食铐,我旁邊那個人剛好下車了匕垫,然后那個孩子很靈活...
    浩然振宇閱讀 240評論 0 0