Я создаю UIProgressView
из nib
. Я хочу увеличить его высоту, но он зафиксирован на 9. Для iPad
мне нужно увеличить его высоту. Как это можно сделать?
Спасибо заранее.
Я создаю UIProgressView
из nib
. Я хочу увеличить его высоту, но он зафиксирован на 9. Для iPad
мне нужно увеличить его высоту. Как это можно сделать?
Спасибо заранее.
Вы не можете изменить высоту UIProgressView через nib. Если вы хотите изменить высоту, вы должны реализовать ее с помощью пользовательского метода рисования.
Используйте 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 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];
Существует простой способ изменить высоту в Interface Builder. Никакой код не требуется, и ваши изменения будут отображаться в IB.
Выберите объект UIProgressView в раскадровке или xib, выберите "Редактор" > "Вывод" > "Высота". Это создаст ограничение по высоте и позволит вам изменить его значение в Инспекторе атрибутов на левой панели (Использует).
Следующий код работает с новейшим быстрым xCode:
var transform : CGAffineTransform = CGAffineTransformMakeScale(1.0, 6.0)
progressView.transform = transform
Swift 3:
progressView.transform = progressView.transform.scaledBy(x: 1, y: 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
}
}
Вот решение
Вы можете использовать преобразование, но возникает проблема: → когда вы меняете ориентацию устройства, высота 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+ используйте Core Graphics и CATransform3DScale, чтобы масштабировать слой в этом представлении:
CATransform3D transform = CATransform3DScale(progressView.layer.transform, 1.0f, 3.0f, 1.0f);
progressView.layer.transform = transform;
Просто убедитесь, что вы сделали это после установки рамки progressView, а не раньше.
Для 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;
Это должно хорошо сработать для вас.
Здесь отображается индикатор выполнения третьей стороны, который позволяет устанавливать высоту. 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/раскадровка).
Код просто
@interface UIProgressView (heavyView)
@end
@implementation UIProgressView (heavyView)
- (CGSize)sizeThatFits:(CGSize)size
{
CGSize newSize = CGSizeMake(size.width, 9);
return newSize;
}
@end
если вы хотите применить изменение только для одного progressView, и у вас есть более одного progressView в вашем классе, вы можете просто использовать подкласс вместо этого.
Метод 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));
}]];
Вместо использования конструктора интерфейса высота 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. Убедитесь, что размер, который вы хотите для своего индикатора выполнения. Теперь перетащите представление прогресса внутри контейнера и соедините все стороны с границами контейнера. Вы должны немедленно увидеть изменение размера хода, чтобы он соответствовал границам его контейнера.
Просто создайте подкласс и настройте собственный размер:
class FatProgressView: UIProgressView {
override var intrinsicContentSize: CGSize {
return CGSize(width: UIView.noIntrinsicMetric, height: 20.0)
}
}
Мы можем установить высоту 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
}
}
Простой. Swift 4.
progressBar.transform = CGAffineTransform (scaleX: self.view.frame.width/progressBar.frame.width, y: self.view.frame.height/progressBar.frame.height)