Как увеличить высоту UIProgressView
Я создаю UIProgressView
с nib
. Я хочу увеличить его высоту, но она зафиксирована на 9. Ибо iPad
мне нужно увеличить его высоту. Как это можно сделать?
спасибо заранее.
19 ответов:
вы не можете изменить высоту UIProgressView через перо. Если вы хотите изменить высоту, то вы должны реализовать его с помощью пользовательского метода рисования.
используйте CGAffineTransform для изменения размеров:
CGAffineTransform transform = CGAffineTransformMakeScale(1.0f, 3.0f); progressView.transform = transform;
поместите этот источник
@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
вот решение
вы можете использовать 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. Просто добавьте ограничение высоты, равное высоте, которую вы хотите, чтобы ваш индикатор выполнения был. Проверить этот ответ на подобный вопрос более подробно.
для 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
установить кадр с помощью кода или построителя интерфейса. Однако вы можете отключить анимацию или полосы.
вот код для Толстого зеленого индикатора выполнения:
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]];
вы можете реализовать категорию (новый файл-категория) и просто добавьте категорию В начале вашего класса. Он отлично работает также с 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. Убедитесь, что это размер, который вы хотите для вашего индикатора выполнения. Теперь перетащите представление хода выполнения внутри контейнера и закрепите все стороны к границам контейнера. Вы должны немедленно увидеть изменение размера представления прогресса, чтобы соответствовать границам его контейнера.