2015-10-26 3 views
8

Я использую UIStackView со следующей конфигурацией:UIStackView собственный intrinsicContentSize

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)] 

intrinsicContentSize.width из stackView должно быть 30.

Вместо этого я получаю:

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

, который говорит мне, что intrinsicContentSize не может быть обеспечена.

Кто-нибудь из вас знает, что я делаю что-то неправильно, если это поведение или если это ошибка?

ответ

10

С прошивкой 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 разрешено (по ограничениям на него) выбирать свой собственный размер, он делает это на основе собственного размера содержимого встроенных субвью (или других ограничений, которые вы задали по размерам его организованных подсмотров).

+0

Представьте, если у меня есть все мои вещи в стеке, и я добавлю этот стек в свой superView. Но у меня все еще есть другое представление (на самом деле у меня есть представление viewController) в моем супервизоре. Как бы связать эти два друг с другом, так что stackview просто взял бы свой собственный размер и оставил остальное для childVC? – Honey

+0

Похоже, вам нужно опубликовать свой собственный вопрос верхнего уровня. –

+0

Вы правы. Я просто пытаюсь получить приблизительную идею. Как 2-строчный ответ. Также причина, по которой я не задавал вопрос, заключается в том, что это мой PlanB ... мой планА не дает мне возможности, но также использует всю мою пропускную способность для кодирования, поэтому я просто хочу получить приблизительную оценку того, что нужно сделать. Можете ли вы дать мне 2-строчный ответ? :/что-нибудь еще, я просто задам вопрос – Honey

0

Созданные вами 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; 

Это будет работать, так как stackview теперь имеет высоту и ширину.

+0

Откуда возникает переменная 'stackViewForCell'? – simonseyer