iOS儀表盤的繪制

隨著iOS技術(shù)的發(fā)展,UI設(shè)計也越來越復(fù)雜矮锈,儀表盤視圖出現(xiàn)的頻率也越來越高,通常用在速度顯示睁蕾、利率選擇等場景愕难。由于工作需要,也研究了一下惫霸。
先展示一下做好的效果圖:


原型圖@2x.png
儀表盤.gif
儀表盤2.gif

首先感謝一下JXCircleSlider,在參考GitHub上的資源之后猫缭,選擇了這個開源項目,作為需求的雛形壹店。這個項目主要作用是猜丹,提供了紅色按鈕的拖動跟蹤效果,這是其他項目中所沒有的硅卢。本人的其他工作是射窒,增加一個結(jié)束跟蹤的代理響應(yīng)、繪制日期和利率将塑、動態(tài)計算利息脉顿、添加中央顯示、長按選擇本金点寥。

@interface JXCircleSlider : UIControl

@property (nonatomic,assign) int lineWidth;
@property (nonatomic,setter=changeAngle:) int angle;

@property (nonatomic, strong) NSArray *dateAngleArray;
@property (nonatomic, strong) NSArray *rateArray;
@property (nonatomic, strong) NSArray *dateArray;

@property (nonatomic, copy) NSString *currentRate;
@property (nonatomic, copy) NSString *currentSavings;
@property (nonatomic, copy) NSString *currentInterest;

- (void)reDrawRect;

@end

JXCircleSlider只是一個demo艾疟,除lineWidth和angle外,其他屬性都是需求需要而添加的。分別分別存儲日期數(shù)組蔽莱、利率數(shù)組弟疆、日期利率在圓上的角度數(shù)組、以及一些需要動態(tài)調(diào)整而增加的屬性:當(dāng)前利率盗冷、當(dāng)前本金怠苔、當(dāng)前利息。

@interface JXCircleSlider ()

@property (nonatomic, strong) UILabel *savingsLabel;
@property (nonatomic, strong) SavingsPickerView *savingsPickerView;
@property (nonatomic, strong) UITextField *textField;

@property (nonatomic, assign) NSTimeInterval beganTime;
@property (nonatomic, assign) NSTimeInterval endTime;

@property (nonatomic, assign) CGFloat unitIntrest0;
@property (nonatomic, assign) CGFloat unitIntrest1;
@property (nonatomic, assign) CGFloat unitIntrest2;
@property (nonatomic, assign) CGFloat unitIntrest3;
@property (nonatomic, assign) CGFloat unitIntrest4;

@end

說明:此處為類的私有屬性仪糖,因為有長按彈出本金選擇的需求添加了UILabel柑司、UIPickerView、和一個接收響應(yīng)者但并不展示的UITextField锅劝。設(shè)置開始和結(jié)束時間beganTime帜羊、endTime是為了區(qū)分用戶是滑動tableview還是滑動儀表盤視圖(做差是否>0.2s)。unitIntrest為優(yōu)化動態(tài)計算利息和設(shè)置的一組屬性鸠天。

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    //繪制背景圖片
    [self drawImageWithCGContextRef:context];
    
    //繪制日期利率
    [self drawDateInterestWithCGContextRef:context];
    
    //繪制浮動利息
    [self drawInfoWithRect:rect];
    
    //繪制拖動小塊
    [self drawDotWithCGContextRef:context];
}

說明:類的主體內(nèi)容,沒有特別的內(nèi)容帐姻。使用UIImage稠集、NSString、UILabel等進(jìn)行渲染到圖形上下文或view即可饥瓷。這里只介紹一下拖動小塊:

- (void)drawDotWithCGContextRef:(CGContextRef)context {
    CGPoint handleCenter =  [self dotPointFromAngle:self.angle];
    [[UIColor redColor] setStroke];
    CGContextSetLineWidth(context, 5);
    CGContextAddEllipseInRect(context, CGRectMake(handleCenter.x, handleCenter.y, 5, 5));
    CGContextDrawPath(context, kCGPathStroke);
}

說明:畫一個半徑為5的點剥纷。以下所有的手勢都需要用這個點來展示效果。

-(BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event{
    [super beginTrackingWithTouch:touch withEvent:event];
        self.beganTime = touch.timestamp;
    return YES;
}


-(BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event{
    [super continueTrackingWithTouch:touch withEvent:event];
    //獲取觸摸點
    CGPoint lastPoint = [touch locationInView:self];
    //使用觸摸點來移動小塊
    [self movehandle:lastPoint];
    //發(fā)送值改變事件
    [self sendActionsForControlEvents:UIControlEventValueChanged];
    
    return YES;
}

- (void)endTrackingWithTouch:(nullable UITouch *)touch withEvent:(nullable UIEvent *)event {
    [super endTrackingWithTouch:touch withEvent:event];
    self.endTime = touch.timestamp;
    
    if (self.endTime - self.beganTime < 0.2) return;
    
    if (self.angle >= [self.dateAngleArray[0] intValue] && self.angle < [self.dateAngleArray[1] intValue]) {
        self.angle = [self.dateAngleArray[1] intValue];
    }else if (self.angle >= [self.dateAngleArray[1] intValue] && self.angle < [self.dateAngleArray[2] intValue]) {
        self.angle = [self.dateAngleArray[2] intValue];
    }else if (self.angle >= [self.dateAngleArray[2] intValue] && self.angle < [self.dateAngleArray[3] intValue]) {
        self.angle = [self.dateAngleArray[3] intValue];
    }else if (self.angle >= [self.dateAngleArray[3] intValue] || self.angle < [self.dateAngleArray[4] intValue]) {
        self.angle = [self.dateAngleArray[4] intValue];
    }else {
        self.angle = [self.dateAngleArray[0] intValue];
    }
    
    //刷新當(dāng)前利息
    [self updateCurrentInterest];
    
    [UIView animateWithDuration:0.5f animations:^{
        //重新繪制
        [self setNeedsDisplay];
    }];
}

說明:項目的核心思路:監(jiān)聽用戶在儀表盤上的拖動行為呢铆。根據(jù)前后兩個點計算偏移角度晦鞋,重置圓點的位置,同時刷新當(dāng)前利息的數(shù)值棺克。
下載地址InstrumentView悠垛、如果對你有用,歡迎點贊娜谊,謝謝确买!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市纱皆,隨后出現(xiàn)的幾起案子湾趾,更是在濱河造成了極大的恐慌,老刑警劉巖派草,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搀缠,死亡現(xiàn)場離奇詭異,居然都是意外死亡近迁,警方通過查閱死者的電腦和手機(jī)艺普,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人衷敌,你說我怎么就攤上這事勿侯。” “怎么了缴罗?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵助琐,是天一觀的道長。 經(jīng)常有香客問我面氓,道長兵钮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任舌界,我火速辦了婚禮掘譬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呻拌。我一直安慰自己葱轩,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布藐握。 她就那樣靜靜地躺著靴拱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猾普。 梳的紋絲不亂的頭發(fā)上袜炕,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音初家,去河邊找鬼偎窘。 笑死,一個胖子當(dāng)著我的面吹牛溜在,可吹牛的內(nèi)容都是我干的陌知。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼掖肋,長吁一口氣:“原來是場噩夢啊……” “哼纵诞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起培遵,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤浙芙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后籽腕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗡呼,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年皇耗,在試婚紗的時候發(fā)現(xiàn)自己被綠了南窗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖万伤,靈堂內(nèi)的尸體忽然破棺而出窒悔,到底是詐尸還是另有隱情,我是刑警寧澤敌买,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布简珠,位于F島的核電站,受9級特大地震影響虹钮,放射性物質(zhì)發(fā)生泄漏聋庵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一芙粱、第九天 我趴在偏房一處隱蔽的房頂上張望祭玉。 院中可真熱鬧,春花似錦春畔、人聲如沸脱货。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽振峻。三九已至,卻和暖如春线召,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背多矮。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工缓淹, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人塔逃。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓讯壶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親湾盗。 傳聞我的和親對象是個殘疾皇子伏蚊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

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