次の構成でUIStackViewを使用しています。
let contentView = UIStackView()
contentView.distribution = .EqualSpacing
contentView.alignment = .Center
contentView.spacing = horizontalSpacing
各要素には独自のintrinsicContentSize
があるため、UIStackView
が独自のintrinsicContentSize
を提供できるはずです。ドキュメントには、spacing
が最小間隔として使用されると記載されています。
例:
view1: width=10
view2: width=15
spacing = 5
[view1(10)]-5-[view2(15)]
StackViewのintrinsicContentSize.width
は30
である必要があります。
代わりに私は得る:
▿ CGSize
- width : -1.0
- height : -1.0 { ... }
これは、intrinsicContentSize
を提供できないことを示しています。
私が何か間違ったことをしているのか、その動作が意図されているのか、それともこれがバグなのか、誰か知っていますか?
IOS 9.1以降、UIStackView
はintrinsicContentSize
を実装していません。
import UIKit
import ObjectiveC
let stackViewMethod = class_getInstanceMethod(UIStackView.self, "intrinsicContentSize")
let viewMethod = class_getInstanceMethod(UIView.self, "intrinsicContentSize")
print(stackViewMethod == viewMethod)
出力:
true
UIStackView
のサブクラスを作成し、本当に必要な場合は自分で実装できます。ただし、そうする必要はありません。 UIStackView
が(制約によって)独自のサイズを選択できる場合は、配置されたサブビューの固有のコンテンツサイズに基づいて(または配置されたサブビューのサイズに設定した他の制約によって)選択します。 )。
作成したUIViewの固有の高さと幅はゼロです。基になるUIViewの代わりに、自動レイアウト制約を使用してみてください。
UIStackViewのサイズを設定するために自動レイアウトを使用することもできます。この使用を行う場合は、配置を中央に設定せず、代わりに塗りつぶしを使用する必要があります。
例:
@property (nonatomic, strong) UIStackView *firstStackView;
@property (nonatomic, strong) UIView *redView;
@property (nonatomic, strong) UIView *blueView;
@property (nonatomic, strong) UIView *yellowView;
@property (nonatomic, strong) UIView *greenView;
@property (nonatomic, strong) NSArray *subViews;
self.redView = [[UIView alloc] init];
self.redView.backgroundColor = [UIColor redColor];
self.blueView = [[UIView alloc] init];
self.blueView.backgroundColor = [UIColor blueColor];
self.yellowView = [[UIView alloc] init];
self.yellowView.backgroundColor = [UIColor yellowColor];
self.greenView = [[UIView alloc] init];
self.greenView.backgroundColor = [UIColor blackColor];
self.subViews = @[self.greenView,self.yellowView,self.redView,self.blueView];
self.firstStackView = [[UIStackView alloc] initWithArrangedSubviews:self.subViews];
self.firstStackView.translatesAutoresizingMaskIntoConstraints = NO;
self.firstStackView.distribution = UIStackViewDistributionFillEqually;
self.firstStackView.axis = UILayoutConstraintAxisHorizontal;
self.firstStackView.alignment = UIStackViewAlignmentFill;
[self.firstStackView.heightAnchor constraintEqualToConstant:40].active = YES;
[self.firstStackView.widthAnchor constraintEqualToConstant:500].active = YES;
スタックビューに高さと幅があるため、これは機能します。