首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使UIProgressView圆角

使UIProgressView圆角
EN

Stack Overflow用户
提问于 2016-12-02 05:34:31
回答 13查看 17K关注 0票数 20

我创建了一个具有以下属性的UIProgressView

代码语言:javascript
复制
progressView.progressTintColor = UIColor.appChallengeColorWithAlpha(1.0)
progressView.trackTintColor = UIColor.clearColor()
progressView.clipsToBounds = true
progressView.layer.cornerRadius = 5

我使用UIView作为边框。似乎他的进步= 1,这正是我想要的方式。

但是,如果进度值小于1,则角不像应该的那样四舍五入。

我漏掉了什么吗?我怎样才能把它变成圆角?

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2016-12-29 05:18:56

在搜索和尝试之后,我决定创建自己的自定义进度视图。这是任何可能在相同问题上发现他们的人的代码。

代码语言:javascript
复制
import Foundation
import UIKit

class CustomHorizontalProgressView: UIView {
var progress: CGFloat = 0.0 {

    didSet {
        setProgress()
    }
}

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

    setup()
}

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

    setup()
}

func setup() {
    self.backgroundColor = UIColor.clearColor()
}

override func drawRect(rect: CGRect) {
    super.drawRect(rect)

    setProgress()
}

func setProgress() {
    var progress = self.progress
    progress = progress > 1.0 ? progress / 100 : progress

    self.layer.cornerRadius = CGRectGetHeight(self.frame) / 2.0
    self.layer.borderColor = UIColor.grayColor().CGColor
    self.layer.borderWidth = 1.0

    let margin: CGFloat = 6.0
    var width = (CGRectGetWidth(self.frame) - margin)  * progress
    let height = CGRectGetHeight(self.frame) - margin

    if (width < height) {
        width = height
    }

    let pathRef = UIBezierPath(roundedRect: CGRect(x: margin / 2.0, y: margin / 2.0, width: width, height: height), cornerRadius: height / 2.0)

    UIColor.redColor().setFill()
    pathRef.fill()

    UIColor.clearColor().setStroke()
    pathRef.stroke()

    pathRef.closePath()

    self.setNeedsDisplay()
}
}

只需将上面的代码放入一个快速文件中,然后将一个UIView拖放到IB中,并给它CustomHorizontalProgressView类。仅此而已。

票数 6
EN

Stack Overflow用户

发布于 2017-03-20 03:11:19

UIProgressView有两个部分,进度部分和跟踪部分。如果您使用显示,您可以看到它只有两个子视图。进度视图层次结构非常简单。所以..。

目标-C

代码语言:javascript
复制
- (void)layoutSubviews
{
    [super layoutSubviews];
    [self.progressView.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        obj.layer.masksToBounds = YES;
        obj.layer.cornerRadius = kProgressViewHeight / 2.0;
    }];
}

Swift (3,4和5+)

代码语言:javascript
复制
override func layoutSubviews() {
    super.layoutSubviews()
    subviews.forEach { subview in
        subview.layer.masksToBounds = true
        subview.layer.cornerRadius = kProgressViewHeight / 2.0
    }
}

我承认subclassextend progressView是推荐的方法。如果你不想为了这么简单的效果而这么做,这可能会起作用。如果苹果会改变视图的层次结构,那么某些事情可能会出错。

票数 28
EN

Stack Overflow用户

发布于 2018-04-11 08:46:39

就这么做吧

代码语言:javascript
复制
    layer.cornerRadius = *desired_corner_radius*
    clipsToBounds = true
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40925453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档