web-dev-qa-db-fra.com

Comment augmenter la hauteur de UIProgressView

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.

51
Chandan Shetty SP

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.

4
raaz

Utilisez CGAffineTransform pour modifier les dimensions: 

CGAffineTransform transform = CGAffineTransformMakeScale(1.0f, 3.0f);  
progressView.transform = transform;
164
ashayk

Utiliser les contraintes de mise en page a fonctionné pour moi:

enter image description here

76
Logan

placer cette source

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

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];
12
orj

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).

11
Matt

Swift 3:

progressView.transform = progressView.transform.scaledBy(x: 1, y: 9)
10
Mohammad Razipour

Le code suivant fonctionne sur le dernier xCode Swift:

var transform : CGAffineTransform = CGAffineTransformMakeScale(1.0, 6.0)
           progressView.transform = transform
10
user4935372

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
    }
}
7
Amit Jagesha シ

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

6
Mayur Kothawade

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. 

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

6
Steve Moser

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.

5
Mike Onorato

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.

4
i_am_jorf

Voici une barre de progression tierce qui permet de régler la hauteur . https://github.com/yannickl/YLProgressBar

enter image description here

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]];

enter image description here

2
ftvs

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.

2
Daniel C.

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. 

 Resized UIProgressView

0
Stephen Paul

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));
    }]];
0
Jason

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)]];
0
user3480295

Juste sous-classe et ajuster la taille intrinsèque:

class FatProgressView: UIProgressView {

    override var intrinsicContentSize: CGSize {
        return CGSize(width: UIView.noIntrinsicMetric, height: 20.0)
    }

}
0