首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIProgressView设置为图像?整个UIprogressView contentView,向下?

UIProgressView设置为图像?整个UIprogressView contentView,向下?
EN

Stack Overflow用户
提问于 2018-02-17 01:06:27
回答 3查看 468关注 0票数 1

你好啊,

在过去的一周里,我一直在试图解决一个如何在我的viewController中创建两个viewController的问题,但几乎没有成功。请看我所附的图表,作为我提出的问题的一个想法。

我正在创建一个带有计时器的游戏,每个问题都经过这个定时器。随着时间的推移,我希望一个UIProgressView在整个屏幕上级联,整个屏幕从蓝色过渡到白色(请参阅图表中的数字1,这表示白色trackTintColor)。

图中的数字2(青色部分)表示progressTintColor。图应该是明确的,因为我希望定制progressView,以便它向下跟踪。这是目前的主要问题之一。(我似乎只能通过小的可定制的Progressview,而不是上下移动的小巧可定制的Progressview来实现漫游)

我想要实现的最困难的部分是(图中的数字3),定制一个UIImageView,这样它就会慢慢地用反色向下排到背景上(因此,狗将是白色的,青色会向下泛滥,以与它身后的progressView相一致)。

到目前为止,这些都是我试图解决这个问题的办法,但没有结果。

我尝试过使用progressView作为backgroundColor,但是我在任何地方都找不到其他人(向下)这样做的例子,所以我不确定这是否可能?

对于这张图片,我试着画了一个CAShape图层,但它似乎是一个很难的形状,像我这样的新手有效地画。当我意识到我将无法在狗后面设置一层不同的颜色来向下移动,因为屏幕也会改变颜色,我放弃了使用这个选项的所有希望。

我尝试了一个UIView转换狗的形象,然而,我能找到的唯一的选择是接近任何地方都是transitionCrossDissolve,它没有给我希望的下行效果,而是只是从一只白狗到一只青色狗,这是不合适的。我是否应该使用progressImage呢?如果是这样的话,有什么地方我可以找到帮助的语法吗?我好像什么地方都找不到。

我现在有55个图像在我的资产文件夹,每一个有略多的青色比上一个,逐步向下移动(因为它通过一个图像数组动画)。虽然这样做是可行的,但它并不是完全无缝的,而且看起来有点像用户正在等待拨号时加载的图像。

如果有人有任何想法或能抽出时间让我了解我将如何做这件事,我将非常感激。我仍然是一个初学者,所以越详细越好!哦,是的,让事情变得更困难,到目前为止,我已经成功地完成了这个应用程序,所以这个形式的答案将是很棒的。

提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-17 08:23:20

我希望你把number 1number 2做得很好。我已经试过第三个了。

我试过用两个UIView。工作很好。我想,这会给你一些想法来达到你的目标。

我有两张照片。

TIMER的帮助下,我尝试了这个ProgressView的示例。

cyanDogView的高度应该是零。一旦计时器开始,高度应该由2px增加。一旦cyanDogView's高度应该大于BlackDogView,那么Timer就停止了。

编码

代码语言:javascript
复制
@IBOutlet weak var blackDogView: UIView!
@IBOutlet weak var blackDogImgVw: UIImageView!

@IBOutlet weak var cyanDogView: UIView!
@IBOutlet weak var cyanDogImgVw: UIImageView!

var getHeight : CGFloat = 0.0
var progressTime = Timer()

override func viewDidAppear(_ animated: Bool) {

    cyanDogView.frame.size.height = 0

    getHeight = blackDogView.frame.height
}

@IBAction func startAnimateButAcn(_ sender: UIButton) {

    progressTime = Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: #selector(self.update), userInfo: nil, repeats: true)

}


@objc func update() {
    cyanDogView.frame.size.height = cyanDogView.frame.size.height + 2

    if cyanDogView.frame.size.height >= getHeight
    {
        progressTime.invalidate()
        cyanDogView.frame.size.height = 0
    }
}

故事板

输出

票数 1
EN

Stack Overflow用户

发布于 2018-02-17 06:39:43

我在这里给你们一些科学怪人的答案,部分是欧比-C部分是斯威夫特。希望能帮上忙。

首先,您可以创建用作模板的图像掩码的bezier路径:

代码语言:javascript
复制
- (UIImage *)cerateImageFromImage:(UIImage *)image
                withMaskImage:(UIImage *)mask {
CGImageRef imageRef = image.CGImage;
CGImageRef maskRef = mask.CGImage;

CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                         CGImageGetHeight(maskRef),
                                         CGImageGetBitsPerComponent(maskRef),
                                         CGImageGetBitsPerPixel(maskRef),
                                         CGImageGetBytesPerRow(maskRef),
                                         CGImageGetDataProvider(maskRef),
                                         NULL,
                                         YES);

CGImageRef maskedReference = CGImageCreateWithMask(imageRef, imageMask);
CGImageRelease(imageMask);

UIImage *maskedImage = [UIImage imageWithCGImage:maskedReference];
CGImageRelease(maskedReference);

return maskedImage;
}

UIImage *image = [UIImage imageNamed:@"Photo.png"];
UIImage *mask = [UIImage imageNamed:@"Mask.png"];
self.imageView.image = [self cerateImageFromImage:image
                                     withMaskImage:mask];

Credit to Keenle

接下来,可以根据路径创建自定义进度视图:

代码语言:javascript
复制
func drawProgressLayer(){

   let bezierPath = UIBezierPath(roundedRect: viewProg.bounds, cornerRadius: viewCornerRadius)
   bezierPath.closePath()
   borderLayer.path = bezierPath.CGPath
   borderLayer.fillColor = UIColor.blackColor().CGColor
   borderLayer.strokeEnd = 0
   viewProg.layer.addSublayer(borderLayer)


}

//Make sure the value that you want in the function `rectProgress` that is going to define 
//the width of your progress bar must be in the range of
// 0 <--> viewProg.bounds.width - 10 , reason why to keep the layer inside the view with some border left spare.
//if you are receiving your progress values in 0.00 -- 1.00 range , just multiply your progress values to viewProg.bounds.width - 10 and send them as *incremented:* parameter in this func

func rectProgress(incremented : CGFloat){

    print(incremented)
    if incremented <= viewProg.bounds.width - 10{
        progressLayer.removeFromSuperlayer()
        let bezierPathProg = UIBezierPath(roundedRect: CGRectMake(5, 5, incremented , viewProg.bounds.height - 10) , cornerRadius: viewCornerRadius)
        bezierPathProg.closePath()
        progressLayer.path = bezierPathProg.CGPath
        progressLayer.fillColor = UIColor.whiteColor().CGColor
        borderLayer.addSublayer(progressLayer)

    }

  }

Credit to Dravidian

请点击蓝色链接,并充分探索他们的答案,以掌握什么是可能的。

票数 0
EN

Stack Overflow用户

发布于 2018-03-06 13:04:02

好的,使用McDonal_11的答案,我已经设法让progressView工作了,但是,我仍然遇到了一些问题。我不能在progressView上添加任何东西,它只是覆盖了下面的所有东西,在狗开始将它的动画变成一只青色的狗之前,有一个短暂的闪光整个青色狗的形象。

代码如下

代码语言:javascript
复制
private let contentView = UIView(frame: .zero)
private let backgroundImageView = UIImageView(frame: .zero)
private let progressView = ProgressView(frame: .zero)
private let clearViewOverProgress = UIView(frame: .zero)
private let blackDogView = UIView(frame: .zero)
private let blackDogViewImage = UIImageView(frame: .zero)
private let cyanDogView = UIView(frame: .zero)
private let cyanDogViewImage = UIImageView()

var timer = Timer()
var startHeight : CGFloat = 0.0

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    self.progressView.setProgress(10.0, animated: true)
    startHeight = cyanDogViewImage.frame.height
    self.cyanDogViewImage.frame.size.height = 0
    self.timer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(self.updateImage), userInfo: nil, repeats: true)
}


override func viewDidLoad() {
    super.viewDidLoad()
    setupViews()

}

func setupViews() {

self.view.addSubview(backgroundImageView)
    self.backgroundImageView.addSubview(progressView)
    self.progressView.addSubview(clearViewOverProgress)
    self.clearViewOverProgress.addSubview(blackDogView)
    self.blackDogView.addSubview(blackDogViewImage)
    self.blackDogViewImage.addSubview(cyanDogView)
    self.cyanDogView.addSubview(cyanDogViewImage)

//设置两个标签的约束(为简洁起见省略)

代码语言:javascript
复制
    self.blackDogViewImage.image = UIImage(named: “BlackDogImage”)

self.cyanDogViewImage.contentMode = UIViewContentMode.top
    self.cyanDogViewImage.clipsToBounds = true
    self.cyanDogViewImage.image = UIImage(named: “CyanDogImage”)
}

func updateImage() {
    cyanDogViewImage.frame.size.height = 
cyanDogViewImage.frame.size.height + 0.07

    if cyanDogViewImage.frame.size.height >= blackDogViewImage.frame.size.height
{
 timer.invalidate()
 cyanDogViewImage.frame.size.height = blackDogViewImage.frame.size.height
    }
}

func outOfTime() {
    timer.invalidate()
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48836938

复制
相关文章

相似问题

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