#swift #progress-bar
#swift #индикатор выполнения
Вопрос:
Мне нужно создать индикатор выполнения на основе изображения в Swift. У меня есть 2 векторных изображения в формате pdf со следующими настройками:
Что я пробовал:
1) Разместить фоновое изображение (UIViewImage)
2) Поместите сверху полное изображение (UIViewImage)
3) Обрезайте полное изображение до 50% (изображение!.CGImage!.обрезка (в:cropZone))
Я ожидал увидеть часть фонового изображения, например:
Но я вижу большую часть полного изображения:
Вот мой тестовый код:
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)
Ответ №1:
Похоже, что для вашего верхнего вида изображения установлен один из .fill
.aspectFit
, или .aspectFill
для режима масштабирования содержимого. Для этого сценария вам нужно убедиться, что вы используете .topLeft
, чтобы гарантировать, что содержимое не масштабируется и не смещается по мере выполнения маскировки.
Комментарии:
1. Я использую векторный PDF, я думаю, что его всегда нужно масштабировать. Если я установлю .TopLeft, я увижу большое изображение, которое не помещается на экране.
2. Ах… Я понимаю. Честно говоря, я бы рекомендовал вам растрировать PDF в нужном вам размере и импортировать его в формате PNG, а не импортировать гигантское векторное изображение и позволять просмотру изображения уменьшать его для вас.
3. Я создаю универсальные приложения для iphone и ipad. Было бы здорово использовать векторную графику вместо создания png для всех разрешений.
4. Я буду использовать PNG.
Ответ №2:
Я написал расширение для 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!)