web-dev-qa-db-ja.com

UIStackView内にUIImageViewを適切に追加する方法

私のUIImageViewには、高解像度の画像が読み込まれています。 UIImageViewをUIStackViewに追加すると、スタックビューは1900x1200のサイズまで大きくなります。 UIImageViewcontentModeはAspectFillに設定されています。

スタックビューに画像を追加した後、画像を現在のサイズ(130x130)のままにするにはどうすればよいですか?

12
Adrian

私はあなたが今までにあなたの質問に答えてくれたことを願っています、しかしここになければあなたは行き​​ます:

スタックビューに配置する前に、UIImageViewに高さと幅の制​​約を追加するだけです。それらを両方とも130にして、あなたは行ってもいいはずです。

20
Rob Norback

画像ビューのアスペクト比を設定することで、これを克服することができました。私のUIImageViewUIStackViewに直接追加されず、代わりにプレーンなUIViewでラップされます。このようにして、追加されたサブビューごとにUIStackViewが作成する制約に直接干渉することを回避できます。

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
3
highmaintenance

セットする

clipToBounds = true

これは、Image viewのオプションをチェックすることで、Interface Builderで実現できます。または、次のようにコードを追加することもできます。

imageView.clipToBounds = true
0
Mukul More