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


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

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

19 51

19 ответов:

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

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

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

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

enter image description here

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

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

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

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

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

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

_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];

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

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

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

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

Swift 3:

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

вот решение

вы можете использовать transform, но возникает проблема, что -> когда вы меняете ориентацию устройства, высота 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.

спасибо

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

https://stackoverflow.com/a/19606981/142358

для iOS 7+ Используйте основную графику и CATransform3DScale чтобы масштабировать слой в этом представлении:

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

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

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
    }
}

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

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

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

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

затем в код, наверное - viewDidLoad добавить:

self.progressHeight.constant = 9;

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

вот индикатор выполнения третьей стороны, который позволяет устанавливать высоту. 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

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

код просто

@interface UIProgressView (heavyView)
@end

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

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

метод Маюра хорошо работал для меня в 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));
    }]];

вместо использования interface builder, высота 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)]];

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

Resized UIProgressView

простой. Swift 4.

progressBar.transform = CGAffineTransform (scaleX: self.вид.рамка.ширина / прогрессбар.рамка.Ширина, м: самовывоз.вид.рамка.высота / прогрессбар.рамка.высота)