我想實現具有進度百分比的半圓搜索欄,如下圖所示。如何在ios中實現seecarc(半圓形seekbar)?
回答
好的。非常艱難嗯。但嚴重不。相信我! 沒有。只需使用下面的代碼。
創建從UIView繼承的類(例如,SgkProgressView)。
現在打開SgkProgressView.h,並添加以下代碼
#import <UIKit/UIKit.h>
@interface SgkProgressView : UIView
@property (assign, nonatomic) IBInspectable CGFloat gaugeWidth;
@property (assign, nonatomic) IBInspectable CGFloat minValue;
@property (assign, nonatomic) IBInspectable CGFloat maxValue;
@property (assign, nonatomic) IBInspectable CGFloat currentValue;
@property (strong, nonatomic) IBInspectable UIColor *baseColor;
@property (strong, nonatomic) IBInspectable UIColor *normalConditionColor;
@property (assign, nonatomic) IBInspectable BOOL enableSeeker;
@property (assign, nonatomic) IBInspectable CGFloat seekerWidth;
@property (strong, nonatomic) IBInspectable UIColor *seekerColor;
@end
現在打開SgkProgressView.m,添加以下代碼
#import "SgkProgressView.h"
#define SGKDegToRad(degrees) (((degrees)/180.0) * M_PI)
#define SGKRadToDeg(radians) (((radians) * 180.0)/M_PI)
IB_DESIGNABLE
@implementation SgkProgressView
- (void)baseInit {
// do here initial settings. but we have already made them in IB.
}
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self baseInit];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
[self baseInit];
}
return self;
}
- (void)drawRect:(CGRect)rect {
CGFloat maxAngle = 30;
CGFloat minAngle = 150;
if (maxAngle <= minAngle)
maxAngle += 360.0;
CGFloat currentAngle = ((((_currentValue - _minValue) * (maxAngle - minAngle))/(_maxValue - _minValue)) + minAngle);
CGPoint center = CGPointMake(self.frame.size.width/2.0, self.frame.size.height/2.0);
CGFloat basePathRadius = MIN(center.x, center.y) - (_gaugeWidth/2.0);
if (_enableSeeker)
basePathRadius -= (_seekerWidth/2.0);
[self drawArcWithCenter:center radius:basePathRadius startAngle:minAngle endAngle:maxAngle withColor:_baseColor];
[self drawArcWithCenter:center radius:basePathRadius startAngle:minAngle endAngle:currentAngle withColor:_normalConditionColor];
if (_enableSeeker) {
CGFloat x = center.x + (basePathRadius * cosf(SGKDegToRad(currentAngle)));
CGFloat y = center.y + (basePathRadius * sinf(SGKDegToRad(currentAngle)));
UIBezierPath *seeker = [UIBezierPath bezierPathWithArcCenter:CGPointMake(x, y) radius:(_seekerWidth/2.0) startAngle:SGKDegToRad(0.0) endAngle:SGKDegToRad(360.0) clockwise:YES];
[_seekerColor setFill];
[seeker fill];
}
}
- (void)drawArcWithCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle withColor:(UIColor *)pathColor {
CGFloat smallArcRadius = _gaugeWidth/2.0;
CGFloat x = center.x + (radius * cosf(SGKDegToRad(startAngle)));
CGFloat y = center.y + (radius * sinf(SGKDegToRad(startAngle)));
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(x, y) radius:smallArcRadius startAngle:SGKDegToRad(startAngle - 180.0) endAngle:SGKDegToRad(startAngle) clockwise:YES];
[path addArcWithCenter:center radius:(radius + smallArcRadius) startAngle:SGKDegToRad(startAngle) endAngle:SGKDegToRad(endAngle) clockwise:YES];
x = center.x + (radius * cosf(SGKDegToRad(endAngle)));
y = center.y + (radius * sinf(SGKDegToRad(endAngle)));
[path addArcWithCenter:CGPointMake(x, y) radius:smallArcRadius startAngle:SGKDegToRad(endAngle) endAngle:SGKDegToRad(endAngle + 180.0) clockwise:YES];
[path addArcWithCenter:center radius:(radius - smallArcRadius) startAngle:SGKDegToRad(endAngle) endAngle:SGKDegToRad(startAngle) clockwise:NO];
[path closePath];
[pathColor setFill];
[path fill];
}
- (void)setEnableSeeker:(BOOL)enableSeeker {
_enableSeeker = enableSeeker;
[self setNeedsDisplay];
}
- (void)setSeekerWidth:(CGFloat)seekerWidth {
_seekerWidth = seekerWidth;
[self setNeedsDisplay];
}
- (void)setCurrentValue:(CGFloat)currentValue {
_currentValue = currentValue;
[self setNeedsDisplay];
}
- (void)setGaugeWidth:(CGFloat)gaugeWidth {
_gaugeWidth = gaugeWidth;
[self setNeedsDisplay];
}
@end
現在在你的ViewController的查看,添加一個UIView的。將其自定義類設置爲SgkProgressView。現在在屬性檢查器中設置屬性,如下所示。
最後你會得到像下面視圖。
你改變cn的顏色和其他性能更高版本。
謝謝,我將如何計算進度百分比,是基於角度還是基於圓上的點數 –
謝謝,我將如何計算進度百分比,是基於角度還是基於圓上的點數? - 我想在(更新)位置顯示百分比,每當我們拖動手柄時,百分比應該增加,當手柄到達弧的末端;百分比應該是100 –
不,你不能這樣做。因爲上面顯示的代碼只接受值。你不能拖動手柄。這只是一個指標的控制。 – appleBoy21
- 1. 給一個半圓的形狀seekbar
- 2. 在Android中實現iOS圓形按鈕
- 3. 如何在WPF中實現錐形/錐形/圓形漸變
- 4. 使用seekbar的半圓形音量控制器
- 5. 繪製一個半圓形按鈕iOS
- 6. CSS圓形半圓鏈接
- 7. 半圓形佈局
- 8. 半圓形滑塊
- 9. 如何在android中創建一個圓形的seekbar
- 10. 如何在半圓形中切出矩形繪圖?
- 11. 如何在iOS中創建圓形UITableView?
- 12. 在ios sdk中創建半圓形旋鈕
- 13. C#路徑中的半圓形矩形
- 14. 如何在opengl中實現圓形填充算法?
- 15. 如何在Android 2.1中實現圓形標籤+
- 16. 如何在dwm中實現圓形切換佈局?
- 17. CSS3 - 如何在矩形上創建圓形邊框半徑?
- 18. 以半圓形繪製點
- 19. Android:如何實現可旋轉的半圓?
- 20. 如何才能實現半圓進度條?
- 21. iOS-與圓心和半徑
- 22. 如何在Python中使用Zelle圖形制作半圓?
- 23. 如何在IE8中實現圓角
- 24. 在BaseAdapter中實現Android中的SeekBar
- 25. 如何保存正在用來改變圓半徑的seekbar的值?
- 26. 半圓形進度條Android - 繪製半圓
- 27. 如何實現xamarin形式的圓形佈局
- 28. 半透明的seekbar
- 29. 如何繪製指定半徑的圓形和矩形?
- 30. 如何呈現半透明(半切)的ViewController在IOS 8
你有試過什麼嗎? – vaibhav