Я создаю UIProgressView
от nib
. Я хочу увеличить его высоту, но он зафиксирован на 9. Для iPad
Мне нужно увеличить его высоту. Как это можно сделать?Как увеличить высоту UIProgressView
Заранее спасибо.
Я создаю UIProgressView
от nib
. Я хочу увеличить его высоту, но он зафиксирован на 9. Для iPad
Мне нужно увеличить его высоту. Как это можно сделать?Как увеличить высоту UIProgressView
Заранее спасибо.
Вы не можете изменить высоту UIProgressView через нить. Если вы хотите изменить высоту, вы должны реализовать ее с помощью пользовательского метода рисования.
Должен быть более простой способ! – vijayst
Этот вопрос аналогичен и имеет решение на основе раскадровки. Мы используем это, но в результате получаю предупреждения. Однако он работает. Я еще не использовал предложенные преобразования, но мне нравится этот подход лучше. http://stackoverflow.com/questions/18717895/progress-view-height-in-ios-7 – Kevin
Я могу изменить его просто отлично в xcode 8.3, так что, возможно, они изменили его, чтобы вы могли сейчас? – bakalolo
Использование CGAffineTransform изменить размеры:
CGAffineTransform transform = CGAffineTransformMakeScale(1.0f, 3.0f);
progressView.transform = transform;
Просто установите рамку 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.
Это работает для меня на прошивке 5. Я использую пользовательский 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];
Это работает только в том случае, если: 1) вы используете iOS 5.0+ 2) вы используете пользовательские изображения 3) вы устанавливаете рамку ПОСЛЕ установки изображений. –
Настройка кадра UIProgressView, похоже, не работает в iOS 7. – Jon
Трансформация тоже не работала. есть идеи? – hasan83
Вот решение
Вы можете использовать преобразование, но возникает проблема -> при изменении ориентации устройства, 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.
Спасибо
Не работает для меня на Xcode 8.3.3, iOS 10, Progress Bar показал только небольшую высоту с обрезанным представлением о прогрессе image – ammianus
Существует простой способ изменить высоту в пределах Interface Builder. Не требуется код, и ваши изменения будут отображаться в IB.
Выберите объект UIProgressView в раскадровке или xib, выберите «Редактор»> «Вывод»> «Высота». Это создаст ограничение по высоте и позволит вам изменить его значение в инспекторе атрибутов на панели слева (используется).
Подробнее о добавлении ограничения высоты в представление прогресса проверьте этот ответ. http://stackoverflow.com/a/19606981/142358 –
Это создает предупреждение в xcode 6, чтобы избежать его? – klefevre
@ kl94: вы можете создать выход для ограничения и установить его во время выполнения. См. Мой ответ ниже. –
места этого источник
@implementation UIProgressView (customView)
- (CGSize)sizeThatFits:(CGSize)size {
CGSize newSize = CGSizeMake(self.frame.size.width, 9);
return newSize;
}
@end
метод Маюры работал хорошо для меня прошивка 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));
}]];
Вы также можете использовать AutoLayout для достижения такого же внешнего вида и он работает в iOS 7.1. Просто добавьте ограничение высоты, равное высоте, которую вы хотите, чтобы ваш индикатор выполнения был. Ознакомьтесь с этим ответом по этому аналогичному вопросу для получения более подробной информации.
Использование ограничений макета работали для меня:
Почему downvote? Это работало на меня и, по крайней мере, на одного другого человека, поэтому, если есть проблема, мы, вероятно, тоже хотели бы знать. – Logan
Это так проклятый хак. C'mon apple, почему бы не сделать это публичной собственностью, если это легко сломать вашу вынужденную высоту. :) – ullstrm
Любите это решение – primax79
Для прошивки 7 и выше, я сделал следующее, которое (а) работает и (б) не генерирует предупреждение:
Сначала добавьте UIProgressView
в мой контроллер Просмотр в раскадровке.Затем добавьте ограничение по высоте к UIProgressView
CTRL + Перетаскивание UIProgressView
в себя. Ограничение будет создано со значением по умолчанию 2
. Оставь это в покое.
Теперь, чтобы изменить высоту добавить IBOutlet
к UIViewController
подкласса в коде следующим образом:
@property (nonatomic, weak) IBOutlet NSLayoutConstraint *progressHeight;
Затем в коде, вероятно - viewDidLoad
, добавьте:
self.progressHeight.constant = 9;
Это должно работать хорошо для тебя.
Не можем ли мы просто сделать это в самой раскадровки, я имею в виду, что мы можем изменить значение ограничения высоты из самой раскадровки, для чего нужен IBOutlet? Я смущен –
Выполнение этого в раскадровке дает только предупреждение. – blyabtroi
Я против предупреждений. –
для IOS 7+, использовать графическое ядро и CATransform3DScale масштабировать слой в этой точке зрения:
CATransform3D transform = CATransform3DScale(progressView.layer.transform, 1.0f, 3.0f, 1.0f);
progressView.layer.transform = transform;
Просто убедитесь, что вы делаете это после того, как установить рамку progressView, не раньше.
Следующий код работает на новейшей быстрой Xcode:
var transform : CGAffineTransform = CGAffineTransformMakeScale(1.0, 6.0)
progressView.transform = transform
Это работало на Swift в IOS 8 –
По состоянию на май 2016 года это правильный ответ. – zeeple
Вот третья сторона прогресс бар, который позволяет установить высоту. 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]];
Вместо использования интерфейса строитель, высота 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)]];
Вы можете реализовать категорию (новый файл - категория) и просто добавить категорию в начале вашего класса. Он отлично работает и с 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 в своем классе, вы можете просто использовать подкласс вместо этого.
Мое предложение состояло в том, чтобы поместить вид контейнера в представлении диспетчера вида в Auto Layout. Убедитесь, что это размер, который вы хотите для своего индикатора выполнения. Теперь перетащите представление прогресса внутри контейнера и соедините все стороны с границами контейнера. Вы должны немедленно увидеть изменение размера хода, чтобы он соответствовал границам его контейнера.
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
}
}
Я сделал компонент y инспектируемым CGFloat и использовал этот код внутри проверяемого var 'didSet'. Он работал красиво. Спасибо! – Adrian
Ваш приветственный @Adrian –
просто. Swift 4.
progressBar.transform = CGAffineTransform (Scalex: self.view.frame.width/progressBar.frame.width, у: self.view.frame.height/progressBar.frame.height)
Дубликат ответа Амита Джагеши. self.view.frame.width не способствует пониманию :) –
Я подумайте, что пришло время изменить правильный ответ :) –
Некоторые предлагаемые применения трансформации отлично работают ... но и некоторые предлагаемые преобразования не работают, когда устройство вращается. Поэтому я думаю, что реализация через пользовательскую ничью (возможно, использование некоторого открытого источника) - правильный ответ. –