2015-08-15 17 views
7

Moja UIImageView jest załadowany obrazem o wysokiej rozdzielczości. Po dodaniu UIImageView do UIStackView, widok stosu będzie rósł do wymiaru 1900x1200. Tryb zawartości UIImageView jest ustawiony na Wypełnienie kształtu.Jak poprawnie dodać UIImageView wewnątrz UIStackView

Co mogę zrobić, aby obraz pozostał z bieżącym wymiarem (130x130) po dodaniu go do widoku stosu?

+0

Dodaj ograniczenia. Twoje pytanie jest zbyt szerokie ... – Wain

+2

[self addConstraint: [NSLayoutConstraint constraintWithItem: atrybut myUIImageVIew: NSLayoutAttributeWidth relatedBy: NSLayoutRelationEqual toItem: nil atrybut: NSLayoutAttributeNotAnAttribute mnożnik: 1.f stałe: 130]]; [self addConstraint: [NSLayoutConstraint constraintWithItem: myUIImageVIew atrybut: NSLayoutAttributeHeight relatedBy: NSLayoutRelationEqual toItem: atrybut nil: mnożnik NSLayoutAttributeNotAnAttribute: 1.f stała: 130]]; – Loxx

Odpowiedz

13

Mam nadzieję, że masz swoje pytanie odpowiedział już, ale jeśli nie możesz przejść:

Wystarczy dodać wysokość i szerokość ograniczenie do UIImageView przed wprowadzeniem go w widoku stosu. Zróbcie oboje 130 i powinieneś być dobry.

+0

Witam Zastanawiam się, dlaczego musieliśmy dodać ograniczenia do UIIMageView przed umieszczeniem wewnątrz widoku stosu. Czy stackView nie powinien nam przeszkadzać? –

+1

Pomaga w ograniczeniach pozycjonowania i wykonuje swoją pracę bardzo dobrze. Byłaby to jednak bardzo restrykcyjna konstrukcja, gdyby wszystko musiało mieć taką samą wysokość i szerokość wewnątrz widoku stosu. Może automatycznie ustawić wysokość i szerokość, ale jeśli chcesz dokładniej kontrolować, to musisz pokonać ograniczenia wysokości i szerokości. –

+0

Takie proste, niesamowite. Zmagałem się z UIImageView wewnątrz stackView i nie myślałem o ograniczeniach na nim przed umieszczeniem go w widoku stosu. Dzięki! – Bastek

2

Udało mi się przezwyciężyć to przez współczynnik proporcji obrazu dla widoku obrazu. Mój UIImageView nie jest bezpośrednio dodawany do UIStackView, zamiast tego jest zawijany zwykłym UIView. W ten sposób uniknę interferencji bezpośrednio z ograniczeniami, które tworzy dla każdego dodanego podglądu.

Przykład wykorzystania 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 
Powiązane problemy