结合了ProgressView的UISlider

end*_*nda 37 streaming objective-c uiprogressview uislider ios4

是否有苹果屋制作的方式来获得带有ProgressView的UISlider.这被许多流应用程序使用,例如本机quicktimeplayer或youtube.(只是为了确定:我只对可视化感兴趣)

滑块与装载机

西蒙欢呼

mat*_*att 47

这是您所描述的简单版本.

替代文字

从某种意义上来说,它是"简单的",我并不打算尝试添加阴影和其他细微之处.但它很容易构建,如果你愿意,你可以调整它以更微妙的方式绘制.例如,您可以制作自己的图像并将其用作滑块的拇指.

这实际上是一个UISlider子类,它位于绘制温度计的UIView子类(MyTherm)之上,另外还有两个绘制数字的UILabel.

UISlider子类消除了内置轨道,因此它后面的温度计显示出来.但UISlider的拇指(旋钮)仍然可以按正常方式拖动,您可以将其设置为自定义图像,当用户拖动它时获取Value Changed事件,依此类推.以下是UISlider子类的代码,它消除了自己的轨道:

- (CGRect)trackRectForBounds:(CGRect)bounds {
    CGRect result = [super trackRectForBounds:bounds];
    result.size.height = 0;
    return result;
}
Run Code Online (Sandbox Code Playgroud)

温度计是自定义UIView子类MyTherm的一个实例.我在笔尖中实例化它并取消选中它的不透明并给它一个Clear Color的背景颜色.它有一个value属性,所以它知道要填充温度计多少.这是它的drawRect:代码:

- (void)drawRect:(CGRect)rect {
    CGContextRef c = UIGraphicsGetCurrentContext();
    [[UIColor whiteColor] set];
    CGFloat ins = 2.0;
    CGRect r = CGRectInset(self.bounds, ins, ins);
    CGFloat radius = r.size.height / 2.0;
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, CGRectGetMaxX(r) - radius, ins);
    CGPathAddArc(path, NULL, radius+ins, radius+ins, radius, -M_PI/2.0, M_PI/2.0, true);
    CGPathAddArc(path, NULL, CGRectGetMaxX(r) - radius, radius+ins, radius, M_PI/2.0, -M_PI/2.0, true);
    CGPathCloseSubpath(path);
    CGContextAddPath(c, path);
    CGContextSetLineWidth(c, 2);
    CGContextStrokePath(c);
    CGContextAddPath(c, path);
    CGContextClip(c);
    CGContextFillRect(c, CGRectMake(r.origin.x, r.origin.y, r.size.width * self.value, r.size.height));
}
Run Code Online (Sandbox Code Playgroud)

要更改温度计值,请将MyTherm实例更改为value0到1之间的数字,并告诉它重绘自身setNeedsDisplay.

  • 你的答案是最复杂的.谢谢 (2认同)
  • 我在Xcode 5.1中遇到了无效的上下文错误,因为这行result.size.height = 0 (2认同)

Sam*_*shi 20

这可以使用标准控件.

在Interface Builder中,UISlider立即将您放在您的顶部UIProgressView并使它们大小相同.

UISlider背景水平线上称为轨道,诀窍是使其不可见.我们这样做是有一个透明的PNG和UISlider方法setMinimumTrackImage:forState:setMaximumTrackImage:forState:.

viewDidLoad视图控制器的方法中添加:

[self.slider setMinimumTrackImage:[UIImage imageNamed:@"transparent.png"] forState:UIControlStateNormal];
[self.slider setMaximumTrackImage:[UIImage imageNamed:@"transparent.png"] forState:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)

在哪里self.slider指你的UISlider.

我已经在Xcode中测试了代码,这将为您提供一个带有独立进度条的滑块.

  • 我选择了这个解决方案,但是不是捆绑透明的png,而是可以在运行时创建透明的1像素UIImage .. UIGraphicsBeginImageContextWithOptions((CGSize){1,1},NO,0.0f); UIImage*transparentImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); (11认同)

小智 5

适合我设计的解决方案:

class SliderBuffering:UISlider {
    let bufferProgress =  UIProgressView(progressViewStyle: .Default)

    override init (frame : CGRect) {
        super.init(frame : frame)
    }

    convenience init () {
        self.init(frame:CGRect.zero)
        setup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    func setup() {
        self.minimumTrackTintColor = UIColor.clearColor()
        self.maximumTrackTintColor = UIColor.clearColor()
        bufferProgress.backgroundColor = UIColor.clearColor()
        bufferProgress.userInteractionEnabled = false
        bufferProgress.progress = 0.0
        bufferProgress.progressTintColor = UIColor.lightGrayColor().colorWithAlphaComponent(0.5)
        bufferProgress.trackTintColor = UIColor.blackColor().colorWithAlphaComponent(0.5)
        self.addSubview(bufferProgress)
    }
} 
Run Code Online (Sandbox Code Playgroud)