14

次の構成で UIStackView を使用しています。

let contentView = UIStackView()
contentView.distribution = .EqualSpacing
contentView.alignment = .Center
contentView.spacing = horizontalSpacing

各要素には独自の要素があるため、独自intrinsicContentSizeの を提供できるはずです。ドキュメントには、が最小間隔として使用されていると記載されています。UIStackViewintrinsicContentSizespacing

例:

view1: width=10
view2: width=15
spacing = 5
[view1(10)]-5-[view2(15)]

intrinsicContentSize.widthstackViewのは である必要があります30

代わりに私は得る:

▿ CGSize
 - width : -1.0
 - height : -1.0 { ... }

これは、 intrinsicContentSize提供できないことを示しています。

私が何か間違ったことをしているのか、動作が意図されているのか、それともバグなのか、誰か知っていますか?

4

3 に答える 3

18

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(制約によって) 独自のサイズを選択できる場合は、配置されたサブビューの固有のコンテンツ サイズに基づいて (または、配置されたサブビューのサイズに設定した他の制約によって) 選択します。

于 2015-10-29T18:58:56.990 に答える
3

代わりにこれを入手してください:

stackView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)

ビューに合わせたい場合は、実際のビューのフレームと、水平および垂直のフィッティングに必要な優先順位を渡すことができます。たとえば、これはビューの幅を保持し、高さのサイズを変更します。

stackView.systemLayoutSizeFitting(view.frame.size, withHorizontalFittingPriority: .required, verticalFittingPriority: .defaultLow)
于 2020-12-27T10:09:19.953 に答える
2

作成した UIView の固有の高さと幅はゼロです。基礎となる UIView の代わりに autolayout 制約を使用してみてください。

UIStackView のサイズを変更するために autolayout を使用することもできます。これを行う場合は、配置を中央に設定せず、代わりに fill を使用する必要があります。

例:

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

スタックビューに高さと幅があるため、これは機能します。

于 2015-10-29T18:46:54.010 に答える