Изменение высоты UIProgressView в Swift

Я пытаюсь изменить размер и поворот представления прогресса, чтобы принять размер экрана. В основном это будет иметь эффект заполнения стекла на экране телефона.

Я повернул его довольно безобидно, используя   self.masteryProgress.transform = CGAffineTransformMakeRotation((CGFloat(-90) / CGFloat(180.0) * CGFloat(M_PI)))

Я получил размер представления, окружающего экран, используя view.bounds, пытаясь получить прямоугольник и высоту x. Поэтому я не застрял там.

Я пробовал использовать .frame .drawRect, но когда я их использую, он либо разбивает их, либо ничего не делает.

Атрибут height, по-видимому, заблокирован с постоянным значением 2 в интерфейсеBuilder.

Какие-либо решения до создания пользовательской анимации?

Я попытался установить высоту индикатора выполнения в интерфейсе, как и некоторые другие сообщения, но мне нужно, чтобы представление прогресса заполняло весь экран независимо от того, какое устройство оно работает, так что решение не будет работать в моем случае.

В итоге я использовал CGAffineTransformScale(masteryProgress.transform, view.bounds.height / 1334, (view.bounds.width / 2))

Поскольку я вращаю progressView вертикально, я устанавливаю представление прогресса на ширину 1334 (высота iPhone 6 Plus) и высоту 2. Деля высоту экрана по этим значениям она должна изменяться на любой телефон.

Ответы

Ответ 1

Вы можете масштабировать его, задав его преобразование так:

Swift 2

masteryProgress.transform = CGAffineTransformScale(masteryProgress.transform, 1, 20)

Свифт 3,4

masteryProgress.transform = masteryProgress.transform.scaledBy(x: 1, y: 20)

enter image description here

Ответ 2

Трансформация по-прежнему является единственным способом достижения этого. Попробуйте добавить его как расширение для UIProgressView.

extension UIProgressView {

    @IBInspectable var barHeight : CGFloat {
        get {
            return transform.d * 2.0
        }
        set {
            // 2.0 Refers to the default height of 2
            let heightScale = newValue / 2.0
            let c = center
            transform = CGAffineTransformMakeScale(1.0, heightScale)
            center = c
        }
    }   
}

Ответ 3

Я столкнулся с проблемой при создании UIProgressView как круглый прямоугольный. При использовании только преобразования

masteryProgress.transform = CGAffineTransformMakeScale(1, 4)

Я достиг чего не было моим последним требованием.

enter image description here

в то время как мое последнее ожидание было что-то вроде следующего

enter image description here

Я наконец достиг этого, выполнив два шага

1. Установите ограничение высоты из Interface Builder:

enter image description here

2. Создайте пользовательский класс UIProgressView и переопределите func layoutSubviews() чтобы добавить пользовательский слой маски:

    override func layoutSubviews() {
        super.layoutSubviews()

        let maskLayerPath = UIBezierPath(roundedRect: bounds, cornerRadius: 4.0)
        let maskLayer = CAShapeLayer()
        maskLayer.frame = self.bounds
        maskLayer.path = maskLayerPath.cgPath
        layer.mask = maskLayer
    }

И вот окончательный результат

enter image description here

Ответ 4

Если вы добавили UIProgressView с помощью Interface Builder, просто создайте ограничение по высоте и измените значение, которое вам нужно. Что это.

Ответ 5

Это будет работать:

masteryProgress.transform = CGAffineTransformMakeScale(1, 4)

Ответ 6

В Swift 3 он изменился на CGAffineTransform (scaleX: CGFloat, y: CGFloat). Таким образом, код будет выглядеть следующим образом:

masteryProgress.transform = CGAffineTransform(scaleX: 1, y: 4)

Ответ 7

В Swift версии 3.0.2 используйте это:

masteryProgress.transform = masteryProgress.transform.scaledBy(x: 1, y: 5)

Ответ 8

Я испытываю то же самое с Swift - UIProgressView заполняется по диагонали

После того, как шкала прогресса шкалы с помощью

CGAffineTransformMakeScale(1.0, 5.0)

анимация бара становится заполнением от левого верхнего угла к нижнему.

Ответ 9

Помещение UIProgressView в UIStackView и установка ограничений UIStackView могут работать. По крайней мере у меня сработало

Ответ 10

Некоторая модификация ответа "Sauvik Dolui":

В UIBezierPath вы должны установить cornerRadius: like (self.frame.height/2). Это более универсальное решение, чем использование (4.0).

override func layoutSubviews() {
    super.layoutSubviews()

    let maskLayerPath = UIBezierPath(roundedRect: bounds, cornerRadius: self.frame.height / 2)
    let maskLayer = CAShapeLayer()
    maskLayer.frame = self.bounds
    maskLayer.path = maskLayerPath.cgPath
    layer.mask = maskLayer
}