2010-08-09 3 views
51

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

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

+4

Я подумайте, что пришло время изменить правильный ответ :) –

+0

Некоторые предлагаемые применения трансформации отлично работают ... но и некоторые предлагаемые преобразования не работают, когда устройство вращается. Поэтому я думаю, что реализация через пользовательскую ничью (возможно, использование некоторого открытого источника) - правильный ответ. –

ответ

4

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

+14

Должен быть более простой способ! – vijayst

+0

Этот вопрос аналогичен и имеет решение на основе раскадровки. Мы используем это, но в результате получаю предупреждения. Однако он работает. Я еще не использовал предложенные преобразования, но мне нравится этот подход лучше. http://stackoverflow.com/questions/18717895/progress-view-height-in-ios-7 – Kevin

+0

Я могу изменить его просто отлично в xcode 8.3, так что, возможно, они изменили его, чтобы вы могли сейчас? – bakalolo

153

Использование CGAffineTransform изменить размеры:

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

Использование преобразования работает отлично. – joet3ch

+8

Преобразование его с помощью шкалы искажает рендеринг. – orj

+2

это не с iOS 7! есть идеи? – hasan83

12

Просто установите рамку 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]; 
+7

Это работает только в том случае, если: 1) вы используете iOS 5.0+ 2) вы используете пользовательские изображения 3) вы устанавливаете рамку ПОСЛЕ установки изображений. –

+2

Настройка кадра UIProgressView, похоже, не работает в iOS 7. – Jon

+0

Трансформация тоже не работала. есть идеи? – hasan83

6

Вот решение

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

Спасибо

+0

Не работает для меня на Xcode 8.3.3, iOS 10, Progress Bar показал только небольшую высоту с обрезанным представлением о прогрессе image – ammianus

11

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

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

+0

Подробнее о добавлении ограничения высоты в представление прогресса проверьте этот ответ. http://stackoverflow.com/a/19606981/142358 –

+0

Это создает предупреждение в xcode 6, чтобы избежать его? – klefevre

+2

@ kl94: вы можете создать выход для ограничения и установить его во время выполнения. См. Мой ответ ниже. –

25

места этого источник

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

Очень приятно. Я бы не подумал об этом. – matt

+0

Это работает в 7.0 и 7.1. Просто создайте пользовательский класс UIProgressView и добавьте его в раскадровку. Измените номер 9 на свой размер. Благодаря !! – Beto

+0

Это умно.:) –

0

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

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

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

64

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

enter image description here

+4

Почему downvote? Это работало на меня и, по крайней мере, на одного другого человека, поэтому, если есть проблема, мы, вероятно, тоже хотели бы знать. – Logan

+9

Это так проклятый хак. C'mon apple, почему бы не сделать это публичной собственностью, если это легко сломать вашу вынужденную высоту. :) – ullstrm

+2

Любите это решение – primax79

4

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

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

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

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

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

self.progressHeight.constant = 9; 

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

+0

Не можем ли мы просто сделать это в самой раскадровки, я имею в виду, что мы можем изменить значение ограничения высоты из самой раскадровки, для чего нужен IBOutlet? Я смущен –

+1

Выполнение этого в раскадровке дает только предупреждение. – blyabtroi

+2

Я против предупреждений. –

5

для IOS 7+, использовать графическое ядро ​​и CATransform3DScale масштабировать слой в этой точке зрения:

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

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

9

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

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

Это работало на Swift в IOS 8 –

+1

По состоянию на май 2016 года это правильный ответ. – zeeple

2

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

0

Вместо использования интерфейса строитель, высота 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)]]; 
2

Вы можете реализовать категорию (новый файл - категория) и просто добавить категорию в начале вашего класса. Он отлично работает и с 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 в своем классе, вы можете просто использовать подкласс вместо этого.

0

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

Resized UIProgressView

4

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

Я сделал компонент y инспектируемым CGFloat и использовал этот код внутри проверяемого var 'didSet'. Он работал красиво. Спасибо! – Adrian

+0

Ваш приветственный @Adrian –

-1

просто. Swift 4.

progressBar.transform = CGAffineTransform (Scalex: self.view.frame.width/progressBar.frame.width, у: self.view.frame.height/progressBar.frame.height)

+0

Дубликат ответа Амита Джагеши. self.view.frame.width не способствует пониманию :) –

 Смежные вопросы

  • Нет связанных вопросов^_^