Как увеличить высоту UIProgressView

Я создаю UIProgressView из nib. Я хочу увеличить его высоту, но он зафиксирован на 9. Для iPad мне нужно увеличить его высоту. Как это можно сделать?

Спасибо заранее.

Ответ 1

Вы не можете изменить высоту UIProgressView через nib. Если вы хотите изменить высоту, вы должны реализовать ее с помощью пользовательского метода рисования.

Ответ 2

Используйте CGAffineTransform для изменения размеров:

CGAffineTransform transform = CGAffineTransformMakeScale(1.0f, 3.0f);  
progressView.transform = transform;

Ответ 3

Использование ограничений компоновки работало для меня:

enter image description here

Ответ 4

поместите этот источник

@implementation UIProgressView (customView)
- (CGSize)sizeThatFits:(CGSize)size {
    CGSize newSize = CGSizeMake(self.frame.size.width, 9);
    return newSize;
}
@end

Ответ 5

Просто установите фрейм UIProgressView в код после его инициализации. Например:

UIProgressView *progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
// progressView frame will be small/standard height

progressView.frame = CGRectMake(0, 0, 100, 20);
// Now the frame is set to my custom rect.

Это работает для меня на iOS 5. Я использую custom trackImage и progressImage. Мой код выглядит так. Обратите внимание, что я добавляю progressView в другое представление и хочу, чтобы он был того же размера, что и содержащий вид, тем самым установив рамку в self.bounds.

_progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
_progressView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
_progressView.trackImage = [[UIImage imageNamed:@"search-progress-track"] resizableImageWithCapInsets:UIEdgeInsetsMake(3.0f, 3.0f, 3.0f, 3.0f)];
_progressView.progressImage = [[UIImage imageNamed:@"search-progress"] resizableImageWithCapInsets:UIEdgeInsetsMake(3.0f, 3.0f, 3.0f, 3.0f)];
_progressView.frame = self.bounds;
[_progressView setProgress:0.5];

Ответ 6

Существует простой способ изменить высоту в Interface Builder. Никакой код не требуется, и ваши изменения будут отображаться в IB.

Выберите объект UIProgressView в раскадровке или xib, выберите "Редактор" > "Вывод" > "Высота". Это создаст ограничение по высоте и позволит вам изменить его значение в Инспекторе атрибутов на левой панели (Использует).

Ответ 7

Следующий код работает с новейшим быстрым xCode:

var transform : CGAffineTransform = CGAffineTransformMakeScale(1.0, 6.0)
           progressView.transform = transform

Ответ 8

Swift 3:

progressView.transform = progressView.transform.scaledBy(x: 1, y: 9)

Ответ 9

Swift3

var transform : CGAffineTransform = CGAffineTransform(scaleX: 1.0, y: 6.0)
progressBar.transform = transform 

Добавление

Если вы работаете с классом IBDesignable, вы можете настроить его с помощью раскадровки:

@IBInspectable var progressBarHeight: CGFloat = 2.0 {
    didSet {
        let transform = CGAffineTransform(scaleX: 1.0, y: progressBarHeight)
        self.progressView.transform = transform
    }
}

Ответ 10

Вот решение

Вы можете использовать преобразование, но возникает проблема: → когда вы меняете ориентацию устройства, высота UIProgressView становится оригинальной.

Таким образом, лучший способ увеличить высоту UIProgressView -

yourProgressView.progressImage=[UIImage imageNamed:@"image1.png"];
yourProgressView.trackImage = [UIImage imageNamed:@"image2.png"];
// IMPORTANT: image1/image2 height (in pixel) = height that you want for yourProgressView.
// no need to set other properties of yourProgressView.

Спасибо

Ответ 11

Вы также можете использовать AutoLayout для достижения такого же взгляда, и он работает в iOS 7.1. Просто добавьте ограничение высоты, равное высоте, которую вы хотите, чтобы ваш индикатор выполнения был. Ознакомьтесь с этим ответом по этому аналогичному вопросу для получения более подробной информации.

fooobar.com/questions/107588/...

Ответ 12

Для iOS 7+ используйте Core Graphics и CATransform3DScale, чтобы масштабировать слой в этом представлении:

CATransform3D transform = CATransform3DScale(progressView.layer.transform, 1.0f, 3.0f, 1.0f);
progressView.layer.transform = transform;

Просто убедитесь, что вы сделали это после установки рамки progressView, а не раньше.

Ответ 13

Для iOS 7 и выше я сделал следующее: (a) работает и (b) не генерирует предупреждение:

Сначала добавьте UIProgressView в My View Controller в раскадровке. Затем добавьте ограничение высоты в UIProgressView CTRL + Перетаскивание UIProgressView в себя. Ограничение будет создано со значением по умолчанию 2. Оставьте это в покое.

Теперь, чтобы изменить высоту, добавьте IBOutlet в подкласс UIViewController в коде следующим образом:

@property (nonatomic, weak) IBOutlet NSLayoutConstraint *progressHeight;

Затем в вашем коде, возможно, - viewDidLoad, добавьте:

self.progressHeight.constant = 9;

Это должно хорошо сработать для вас.

Ответ 14

Здесь отображается индикатор выполнения третьей стороны, который позволяет устанавливать высоту. https://github.com/yannickl/YLProgressBar

enter image description here

Установить фрейм через код или конструктор интерфейса. Однако вы можете отключить анимацию или полосы.

Вот код для толстого зеленого индикатора выполнения:

YLProgressBar *bar = [[YLProgressBar alloc] initWithFrame:CGRectMake(0, 100, 100, 50)];
bar.progress = 0.5;
bar.type = YLProgressBarTypeFlat;
bar.hideStripes = YES;
bar.behavior = YLProgressBarBehaviorDefault;
bar.progressTintColors = @[[UIColor greenColor], [UIColor greenColor]];

enter image description here

Ответ 15

Вы можете реализовать категорию (новая категория файлов) и просто добавьте категорию в начале вашего класса. Он отлично работает и с iboutlet (nib/раскадровка).

Код просто

@interface UIProgressView (heavyView)
@end

@implementation UIProgressView (heavyView)
- (CGSize)sizeThatFits:(CGSize)size
{
    CGSize newSize = CGSizeMake(size.width, 9);
    return newSize;
}
@end

если вы хотите применить изменение только для одного progressView, и у вас есть более одного progressView в вашем классе, вы можете просто использовать подкласс вместо этого.

Ответ 16

Метод Mayur работал хорошо для меня в iOS 7, здесь мой код (использует UIImage + BBlock)

    CGFloat progressViewHeight = 5;
    [[UIProgressView appearance] setProgressImage:[UIImage imageForSize:CGSizeMake(1, progressViewHeight) withDrawingBlock:^{
        CGContextRef context = UIGraphicsGetCurrentContext();
        UIColor * colortoUse = [UIColor blueColor];
        CGContextSetFillColorWithColor(context, [colortoUse CGColor]);
        CGContextFillRect(context, CGRectMake(0, 0, 1, progressViewHeight));
    }]];

    [[UIProgressView appearance] setTrackImage:[UIImage imageForSize:CGSizeMake(1, progressViewHeight) withDrawingBlock:^{
        CGContextRef context = UIGraphicsGetCurrentContext();
        UIColor * colortoUse = [UIColor progressViewBackgroundColor];
        CGContextSetFillColorWithColor(context, [colortoUse CGColor]);
        CGContextFillRect(context, CGRectMake(0, 0, 1, progressViewHeight));
    }]];

Ответ 17

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

UIProgressView *progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
progressView.translatesAutoresizingMaskIntoConstraints = NO;
CGRect frame = CGRectMake(100, 200, 200, 50);
[self.view addSubview:progressView];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-y-[progressView(height)]" options:0
                                                                  metrics:@{@"y": @(CGRectGetWidth(frame)),
                                                                            @"height": @(CGRectGetHeight(frame))}
                                                                    views:NSDictionaryOfVariableBindings(progressView)]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-x-[progressView(width)]" options:0
                                                                  metrics:@{@"x": @(CGRectGetMinX(frame)),
                                                                            @"width": @(CGRectGetWidth(frame))}
                                                                    views:NSDictionaryOfVariableBindings(progressView)]];

Ответ 18

Мое предложение состояло в том, чтобы разместить представление контейнера в представлении контроллера вида в Auto Layout. Убедитесь, что размер, который вы хотите для своего индикатора выполнения. Теперь перетащите представление прогресса внутри контейнера и соедините все стороны с границами контейнера. Вы должны немедленно увидеть изменение размера хода, чтобы он соответствовал границам его контейнера.

Изменение размера UIProgressView

Ответ 19

Просто создайте подкласс и настройте собственный размер:

class FatProgressView: UIProgressView {

    override var intrinsicContentSize: CGSize {
        return CGSize(width: UIView.noIntrinsicMetric, height: 20.0)
    }

}

Ответ 20

Мы можем установить высоту UIProgressView, создав собственный класс ProgressView, создав подкласс UIProgressView.

В Свифте,

public class ProgressView: UIProgressView {
    var height: CGFloat = 4.0
    public override func sizeThatFits(_ size: CGSize) -> CGSize {
        return CGSize(width: size.width, height: height) // We can set the required height
    }
}

Ответ 21

Простой. Swift 4.

progressBar.transform = CGAffineTransform (scaleX: self.view.frame.width/progressBar.frame.width, y: self.view.frame.height/progressBar.frame.height)