Je crée UIProgressView
à partir de nib
. Je veux augmenter sa hauteur mais il est fixé à 9. Pour iPad
, je dois augmenter sa hauteur. Comment cela peut-il être fait?
Merci d'avance.
Vous ne pouvez pas modifier la hauteur de UIProgressView via nib . Si vous souhaitez modifier la hauteur, vous devez l'implémenter via une méthode de dessin personnalisée.
Utilisez CGAffineTransform pour modifier les dimensions:
CGAffineTransform transform = CGAffineTransformMakeScale(1.0f, 3.0f);
progressView.transform = transform;
Utiliser les contraintes de mise en page a fonctionné pour moi:
placer cette source
@implementation UIProgressView (customView)
- (CGSize)sizeThatFits:(CGSize)size {
CGSize newSize = CGSizeMake(self.frame.size.width, 9);
return newSize;
}
@end
Il suffit de définir le cadre de UIProgressView dans le code après son initialisation. Par exemple:
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.
Cela fonctionne pour moi sur iOS 5. J'utilise cependant trackImage et progressImage personnalisés. Mon code ressemble à ceci. Notez que j'ajoute progressView à une autre vue et que je veux qu'il ait la même taille que la vue contenant, ce qui permet de définir le cadre sur 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];
Il existe un moyen simple de modifier la hauteur dans Interface Builder. Aucun code requis et votre modification apparaîtra dans IB.
Sélectionnez l'objet UIProgressView dans votre storyboard ou votre xib, choisissez Editeur> Épingler> Hauteur. Cela créera une contrainte de hauteur et vous permettra de modifier sa valeur dans l'inspecteur d'attributs situé dans le panneau de gauche (Utilises).
Swift 3:
progressView.transform = progressView.transform.scaledBy(x: 1, y: 9)
Le code suivant fonctionne sur le dernier xCode Swift:
var transform : CGAffineTransform = CGAffineTransformMakeScale(1.0, 6.0)
progressView.transform = transform
Swift3
var transform : CGAffineTransform = CGAffineTransform(scaleX: 1.0, y: 6.0)
progressBar.transform = transform
Addenda
Si vous travaillez avec une classe IBDesignable
, vous pouvez la modifier avec ceci à partir de votre scénario:
@IBInspectable var progressBarHeight: CGFloat = 2.0 {
didSet {
let transform = CGAffineTransform(scaleX: 1.0, y: progressBarHeight)
self.progressView.transform = transform
}
}
Voici la solution
Vous pouvez utiliser transform, mais le problème se pose que -> lorsque vous modifiez l'orientation du périphérique, la hauteur UIProgressView devient celle d'origine.
Donc, le meilleur moyen d’augmenter la hauteur de UIProgressView est
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.
Je vous remercie
Vous pouvez également utiliser AutoLayout pour obtenir le même aspect et cela fonctionne dans iOS 7.1. Ajoutez simplement une contrainte de hauteur égale à la hauteur souhaitée pour votre barre de progression. Consultez cette réponse sur cette question similaire pour plus de détails.
Pour iOS 7+, utilisez Core Graphics et CATransform3DScale pour redimensionner le calque dans cette vue:
CATransform3D transform = CATransform3DScale(progressView.layer.transform, 1.0f, 3.0f, 1.0f);
progressView.layer.transform = transform;
Assurez-vous juste de faire ceci après que vous ayez défini le cadre de progressView, pas avant.
Pour iOS 7 et les versions ultérieures, j’ai fait ce qui suit: (a) fonctionne et (b) ne génère pas d’avertissement:
Ajoutez d’abord UIProgressView
à mon contrôleur de vue dans le storyboard. Ajoutez ensuite une contrainte de hauteur à la UIProgressView
par CTRL + en faisant glisser la UIProgressView
sur elle-même. La contrainte sera créée avec une valeur par défaut de 2
. Laisse ça tranquille.
Maintenant, pour changer la hauteur, ajoutez une IBOutlet
à la sous-classe UIViewController
dans le code comme ceci:
@property (nonatomic, weak) IBOutlet NSLayoutConstraint *progressHeight;
Ensuite, dans votre code, probablement - viewDidLoad
, ajoutez:
self.progressHeight.constant = 9;
Cela devrait bien fonctionner pour vous.
Voici une barre de progression tierce qui permet de régler la hauteur . https://github.com/yannickl/YLProgressBar
Définir le cadre via le constructeur de code ou d'interface. Vous voudrez peut-être désactiver l'animation ou les bandes, cependant.
Voici le code pour une barre de progression verte épaisse:
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]];
Vous pouvez implémenter une catégorie (nouveau fichier - catégorie) Et ajouter simplement la catégorie au début de votre classe . Cela fonctionne également avec iboutlet (nib/storyboard).
Le code est juste
@interface UIProgressView (heavyView)
@end
@implementation UIProgressView (heavyView)
- (CGSize)sizeThatFits:(CGSize)size
{
CGSize newSize = CGSizeMake(size.width, 9);
return newSize;
}
@end
si vous souhaitez appliquer la modification à un seul progressView et que vous avez plusieurs progressView dans votre classe, vous pouvez simplement utiliser une sous-classe à la place.
Ma suggestion serait de placer une vue conteneur sur la vue de votre contrôleur de vue dans Mise en page automatique. Assurez-vous que c'est la taille que vous voulez pour votre barre de progression. Maintenant, faites glisser une vue de progression à l'intérieur du conteneur et épinglez tous les côtés sur les limites du conteneur. Vous devriez immédiatement voir la vue de progression redimensionner pour s'adapter aux limites de son conteneur.
La méthode de Mayur a bien fonctionné pour moi sous iOS 7, voici mon code (utilise 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));
}]];
Au lieu d'utiliser le générateur d'interface, la hauteur de UIProgressView
peut être modifiée en lui ajoutant des contraintes par programme.
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)]];
Juste sous-classe et ajuster la taille intrinsèque:
class FatProgressView: UIProgressView {
override var intrinsicContentSize: CGSize {
return CGSize(width: UIView.noIntrinsicMetric, height: 20.0)
}
}