2015-08-15 11 views
7

My UIImageView è caricato con un'immagine ad alta risoluzione. Quando aggiungo UIImageView a UIStackView, la vista dello stack crescerà fino a una dimensione di 1900x1200. UImageView contentMode è impostato su Aspect Fill.Come aggiungere correttamente UIImageView all'interno di UIStackView

Cosa posso fare affinché l'immagine rimanga con la sua dimensione attuale (130x130) dopo averla aggiunta alla vista pila?

+0

aggiungere vincoli. La tua domanda è troppo ampia ... – Wain

+2

[auto addConstraint: [NSLayoutConstraint constraintWithItem: attributo myUIImageVIew: NSLayoutAttributeWidth relatedBy: NSLayoutRelationEqual toItem: attributo nil: NSLayoutAttributeNotAnAttribute moltiplicatore: 1.f costante: 130]]; [self addConstraint: [NSLayoutConstraint constraintWithItem: myUIImageVIew attributo: NSLayoutAttributeHeight relatedBy: NSLayoutRelationEqual toItem: nil attribute: NSLayoutAttributeNotAnAttribute moltiplicatore: 1.f costante: 130]]; – Loxx

risposta

13

Io spero tu abbia risposto alla tua domanda, ormai, ma se non qui si va:

è sufficiente aggiungere un vincolo di altezza e la larghezza al vostro UIImageView prima di metterlo nella vista stack. Fateli entrambi entrambi 130 e dovreste essere pronti a partire.

+0

Ciao mi stavo chiedendo perché abbiamo dovuto aggiungere vincoli a UIIMageView prima di posizionare all'interno di una vista stack. Lo stackView non si occupa dei vincoli per noi? –

+1

Aiuta con i vincoli di posizionamento e fa il suo lavoro molto bene. Ma sarebbe un costrutto molto restrittivo se ogni cosa dovesse avere la stessa altezza e larghezza all'interno della vista pila. Può impostare automaticamente altezza e larghezza, ma se vuoi un controllo più preciso, i vincoli di altezza e larghezza sono la strada da percorrere. –

+0

Così semplice, fantastico. Ero alle prese con UIImageView all'interno di stackView e non pensavo ai vincoli su di esso prima di metterlo effettivamente in pila. Grazie! – Bastek

2

Sono stato in grado di risolvere questo problema con le proporzioni delle impostazioni per la visualizzazione dell'immagine. Il mio UIImageView non è stato aggiunto direttamente a UIStackView, ma è stato spostato semplicemente in UIView. In questo modo posso evitare di interferire direttamente con qualsiasi vincolo creato da UIStackView per ogni sottoview aggiunto.

Esempio con PureLayout:

#import <math.h> 
#import <float.h> 

@interface StackImageView : UIView 

@property (nonatomic) UIImageView *imageView; 
@property (nonatomic) NSLayoutConstraint *aspectFitConstraint; 

@end 

@implementation StackImageView 

// skip initialization for sanity 
// - (instancetype)initWithFrame:... 

- (void)setup { 
    self.imageView = [[UIImageView alloc] initForAutoLayout]; 
    self.imageView.contentMode = UIViewContentModeScaleAspectFit; 

    [self addSubview:self.imageView]; 

    // pin image view to superview edges 
    [self.imageView autoPinEdgesToSuperviewEdges]; 
} 

- (void)setImage:(UIImage *)image { 
    CGSize size = image.size; 
    CGFloat aspectRatio = 0; 

    // update image 
    self.imageView.image = image; 

    if(fabs(size.height) >= FLT_EPSILON) { 
     aspectRatio = size.width/size.height; 
    } 

    // Remove previously set constraint 
    if(self.aspectFitConstraint) { 
     [self.imageView removeConstraint:self.aspectFitConstraint]; 
     self.aspectFitConstraint = nil; 
    } 

    // Using PureLayout library 
    // you may achieve the same using NSLayoutConstraint 
    // by setting width-to-height constraint with 
    // calculated aspect ratio as multiplier value 
    self.aspectFitConstraint = 
    [self.imageView autoMatchDimension:ALDimensionWidth 
          toDimension:ALDimensionHeight 
           ofView:self.imageView 
         withMultiplier:aspectRatio 
           relation:NSLayoutRelationEqual]; 
} 

@end 
Problemi correlati