Индикатор выполнения на основе изображения - PullRequest
0 голосов
/ 08 апреля 2019

Мне нужно создать индикатор выполнения на основе изображения в Swift. У меня есть 2 векторных изображения в формате PDF со следующими предпочтениями: enter image description here enter image description here

Что я пробовал:
1) Поместить фоновое изображение (UIViewImage)
2) Поместить сверху полное изображение (UIViewImage)
3) Обрезать полное изображение до 50% (изображение! .CgImage! .Cropping (to: cropZone))

Я ожидал увидеть часть фонового изображения, например:
enter image description here

Но я вижу большую часть полного изображения:
enter image description here

Вот мой тестовый код:

    let cropZone = CGRect(x:30,y:375-96,width:70,height:184)
    let cutImageRef: CGImage = self.coolantFull.image!.cgImage!.cropping(to:cropZone)!
    self.coolantFull.image! = UIImage(cgImage: cutImageRef)

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Я написал расширение для UIImageView, которое создает новое изображение на основе процентов и изменяет размеры.Заполнение идет снизу вверх.Растрированный PDF выглядит плохо, поэтому теперь я использую png @ 1, @ 2, @ 3.

extension UIImageView {
func progress(to _percent: CGFloat, image: UIImage) {
    // restore original image and size in UIImageView
    self.image! = image
    self.frame.size = image.size
    // if less then 0, return 0
    var percent = _percent <= 0 ? 1 : _percent
    // if more then 100, return 100
    percent = percent > 100 ? 100 : percent
    let size = CGSize(width: self.frame.size.width, height: self.frame.size.height/100*percent)
    UIGraphicsBeginImageContextWithOptions(size, false, self.image!.scale)
    self.image!.draw(in: CGRect(x: 0,
                                y: -self.frame.size.height+size.height,
                                width: self.image!.size.width,
                                height: self.image!.size.height))

    let croppedImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()

    self.frame = CGRect(x: self.frame.origin.x,
                        y: self.frame.height-self.frame.height/100*percent,
                        width: self.frame.width,
                        height: self.frame.height/100*percent)
    self.image! = croppedImage
}

Как использовать:

@IBOutlet weak var coolantProgress: UIImageView!

let coolantEmptyImage = UIImage.init(named: "coolantFull")
coolantProgress.progress(to: 25, image: coolantEmptyImage!)

enter image description here

0 голосов
/ 08 апреля 2019

Похоже, что ваш верхний просмотр изображений установлен на один из .fill, .aspectFit или .aspectFill для режима масштабирования контента. В этом сценарии вы должны убедиться, что вы используете .topLeft, чтобы гарантировать, что содержимое не масштабируется и не сдвигается по ходу маскирования.

...