Iphone 如何做双圆形滑块(类时钟功能)
我想知道如何做一个附加的图像双滑块 我正在看这个代码来修改它。我想知道如何有2个滑块,让用户选择所需的时间 我遇到的问题是如何使用2个滑块来显示类似图像的内容 非常感谢您的评论Iphone 如何做双圆形滑块(类时钟功能),iphone,ios,xcode,uislider,Iphone,Ios,Xcode,Uislider,我想知道如何做一个附加的图像双滑块 我正在看这个代码来修改它。我想知道如何有2个滑块,让用户选择所需的时间 我遇到的问题是如何使用2个滑块来显示类似图像的内容 非常感谢您的评论 对于双滑块位置,代码中有此摘录 CGContextAddArc(imageCtx, self.frame.size.width/2 , self.frame.size.height/2, radius, 0, ToRad(self.angle), 0); 第一个零(0)是起点,因此您希望在此处使用不同的角度 CGC
对于双滑块位置,代码中有此摘录
CGContextAddArc(imageCtx, self.frame.size.width/2 , self.frame.size.height/2, radius, 0, ToRad(self.angle), 0);
第一个零(0
)是起点,因此您希望在此处使用不同的角度
CGContextAddArc(imageCtx, self.frame.size.width/2 , self.frame.size.height/2, radius, ToRad(self.startAngle), ToRad(self.endAngle), 0);
(当然,你的标题中需要这两个ivar)
编辑:这是编辑后的代码,用于查找最近的旋钮并锁定以进行修改。旧代码没有锁定它,因此它会在鼠标悬停时从一个旋钮切换到另一个旋钮。首先,在实现上方添加
enum
:
enum SliderLockType {
SliderLockedNone = 0,
SliderLockedStart,
SliderLockedEnd
};
#pragma mark - Implementation -
@implementation TBCircularSlider
enum SliderLockType sliderLock;
// … some code here …
//Initialize the Angle at 0
//self.startAngle = 0;
//self.endAngle = 270;
/** Tracking is started **/
-(BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event{
[super beginTrackingWithTouch:touch withEvent:event];
// find nearest knob …
CGPoint lastPoint = [touch locationInView:self];
CGPoint pStart = [self centerPointFromAngel:self.startAngle];
CGPoint pEnd = [self centerPointFromAngel:self.endAngle];
float diffA = [self distanceBetween:lastPoint and:pStart];
float diffB = [self distanceBetween:lastPoint and:pEnd];
// … and lock it
if (diffA <= TB_LINE_WIDTH) { // the tolerance is the width of the circle
sliderLock = SliderLockedStart;
} else if (diffB <= TB_LINE_WIDTH) {
sliderLock = SliderLockedEnd;
}
//We need to track continuously
return YES;
}
// continueTrackingWithTouch:withEvent: stays unchanged
/** Track is finished **/
-(void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event{
[super endTrackingWithTouch:touch withEvent:event];
// reset the lock before starting a new touch event
sliderLock = SliderLockedNone;
}
- (CGPoint)centerPointFromAngel:(int)angleInt {
CGPoint point = [self pointFromAngle:angleInt];
point.x += TB_LINE_WIDTH/2;
point.y += TB_LINE_WIDTH/2;
return point;
}
- (CGFloat)distanceBetween:(CGPoint)p1 and:(CGPoint)p2 {
CGFloat xDist = (p2.x - p1.x);
CGFloat yDist = (p2.y - p1.y);
return sqrt((xDist * xDist) + (yDist * yDist));
}
// … some more code …
- (void)drawTheHandle:(CGContextRef)ctx {
CGContextSaveGState(ctx);
//I Love shadows
CGContextSetShadowWithColor(ctx, CGSizeMake(0, 0), 3, [UIColor blackColor].CGColor);
//Get the handle position!
CGPoint handleCenterA = [self pointFromAngle: self.startAngle];
CGPoint handleCenterB = [self pointFromAngle: self.endAngle];
//Draw It!
[[UIColor colorWithWhite:1.0 alpha:0.7]set];
CGContextFillEllipseInRect(ctx, CGRectMake(handleCenterA.x, handleCenterA.y, TB_LINE_WIDTH, TB_LINE_WIDTH));
CGContextFillEllipseInRect(ctx, CGRectMake(handleCenterB.x, handleCenterB.y, TB_LINE_WIDTH, TB_LINE_WIDTH));
CGContextRestoreGState(ctx);
}
- (void)movehandle:(CGPoint)lastPoint {
//Get the center
CGPoint centerPoint = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);
//Calculate the direction from the center point to an arbitrary position.
float currentAngle = AngleFromNorth(centerPoint, lastPoint, NO);
int angleInt = 360 - floor(currentAngle);
if (sliderLock == SliderLockedStart) {
self.startAngle = angleInt;
} else if (sliderLock == SliderLockedEnd) {
self.endAngle = angleInt;
}
//Redraw
[self setNeedsDisplay];
}
你的问题由许多不同的子问题组成,老实说,我几乎想以“不是真正的问题”来结束它,因为这使得回答起来很困难,但我想尝试并帮助你。你尝试过什么?你遇到的最大问题是什么?你知道如何用两个拇指做一个平滑块吗?是圆形图纸让你退缩了吗?此外,您的问题没有提供足够的细节,说明滑块应该如何工作,以便有人完全回答。你说“像时钟一样”。这是一个小时范围还是一分钟一小时的选择(即一只手影响另一只手)?@DavidRönnqvist感谢您的回答。我正在学习如何用“是”来表示阻碍我前进的圆形图形。是我正在寻找的时间范围,允许用户从下午6点到晚上10点(4小时)开始。很抱歉,这个问题让人困惑。那么,是圆形绘图还是圆形触摸处理让你困惑?我快速地看了一眼,这似乎很好地解释了这两个问题。@Desmond如果你告诉我这是不是你正在寻找的,那就太好了for@relikd很抱歉迟了答复。上周我因为一些私事离开了,如果现在能用的话,我想试试。会让你不断更新。。。谢谢分享代码。。。干杯感谢这段很棒的代码!!,它很有魅力。你能不能再帮我一次碰撞检测,因为我不希望彼此重叠。另外,您是否知道如何仅更改2白色旋钮上的触摸?非常感谢您的回复!!!编辑代码,我想这正是你想要的。滑块将跳转到12小时的位置,就像在时钟上一样。另外,增加了一些旋钮锁定,以防止在移动第一个旋钮时编辑第二个旋钮。这是我需要的。非常感谢你的帮助。我是否需要在-(BOOL)continueTrackingWithTouch:(UITouch*)touch with event:(UIEvent*)event中执行某些操作??好像我继续触摸这个结,它就会流出来。
int angleInt = (int)(360 - floor(currentAngle)) / 30 * 30; // 360/30 = 12 -> hours
if (sliderLock == SliderLockedStart && angleInt%360 != self.endAngle%360) {
self.startAngle = angleInt;
} else if (sliderLock == SliderLockedEnd && angleInt%360 != self.startAngle%360) {
self.endAngle = angleInt;
}