2015-10-26 6 views
8

私は次のような構成でUIStackViewを使用しています:UIStackView自身intrinsicContentSize

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

の各要素は、それがUIStackViewintrinsicContentSize、独自に提供するので、それは可能なはずintrinsicContentSize自分のしています。ドキュメントには、最小間隔としてspacingが使用されていると記載されています。

例:

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

stackViewのintrinsicContentSize.width30であるべきです。

代わりに私が取得:intrinsicContentSizeが提供できないことを私に伝えます

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

私が何か間違っているかどうか、動作が意図されているか、これがバグかどうかを知っている人はいますか?

答えて

10

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がそれ自身のサイズを選択することが許されている場合(その制約によって)、配置されたサブビューの本質的なコンテンツサイズ(または配置されたサブビューのサイズに設定した他の制約)に基づいて行われます。

+0

私はすべて私のものをstackviewの中に入れて、このスタックビューをスーパービューに追加するとします。しかし、私はまだ私のsuperViewに別のビュー(実際に私はviewControllerのビューを持っている)があります。どのようにこれらの2つをお互いに制約するので、stackviewはその固有のサイズを取り、残りをchildVCのままにしますか? – Honey

+0

自分のトップレベルの質問を投稿する必要があるように思えます。 –

+0

あなたは正しいです。私はちょうど大まかなアイディアを得ようとしています。 2行の応答のように。また、私が質問を投稿しなかったのは、これが私のPlanBだからです...私のplanAは私に失敗していますが、私のコーディング帯域幅もすべて取っているので、何をする必要があるのか​​概算したいだけです。あなたは私に2行の応答を与えることができますか? :/それ以上のことは何でも質問します。 – Honey

0

作成したUIViewの本来の高さと幅はゼロです。基本となるUIViewの代わりに自動レイアウト制約を使用してみてください。

また、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; 

stackviewは今、高さと幅を持っているので、これは動作します。 iOSの9.1、UIStackViewのよう

+0

'stackViewForCell'変数はどこから来ますか? – simonseyer