2016-04-29 3 views
1

У меня есть UIStackView (stack1), который содержит два расположенных с видом: а UIStackView (stack2) и UIScrollView (scroll)IOS, UIStackView контрсил анимации скрытого

stack2 имеют фиксированную высоту и оба его и scroll имеют фиксированную ширину. scroll займет оставшееся место.

С нажатием кнопки, stack2 будет Hidden, в результате чего scroll расширяться и «двигаться вверх» и с той же кнопкой, stack2 снова появится и `прокрутки вернуться к исходному размеру

По какой-то причине, первая анимация прекрасно работает, но когда stack2 должен появиться снова, он появляется за scroll, который все еще занимает все пространство. Почему это? Я также получаю предупреждение «Невозможно одновременно удовлетворить ограничения».

Вот как они созданы (это Xamarin кстати, но я не думаю, что вопросы)

var stack1 = new UIStackView(View.Frame); 
stack1.Axis = UILayoutConstraintAxis.Vertical; 
stack1.Alignment = UIStackViewAlignment.Center; 
stack1.Distribution = UIStackViewDistribution.FillProportionally; 
stack1.Spacing = 0; 

var scroll = new UIScrollView(frame); 
var stack2 = new UIStackView(); 
stack2.Axis = UILayoutConstraintAxis.Horizontal; 
stack2.Alignment = UIStackViewAlignment.Center; 
stack2.Distribution = UIStackViewDistribution.EqualCentering; 
stack2.Spacing = 20; 

... adding things in stack2 ... 

scroll.TranslatesAutoresizingMaskIntoConstraints = false; 
stack2.TranslatesAutoresizingMaskIntoConstraints = false; 

NSLayoutConstraint.ActivateConstraints(new []{ 
    stack2.HeightAnchor.ConstraintEqualTo(200), 
    scroll.HeightAnchor.ConstraintEqualTo(frame.Height), 
    scroll.WidthAnchor.ConstraintEqualTo(frame.Width) 
}); 

stack1.AddArrangedSubview(stack2); 
stack1.AddArrangedSubview(scroll); 
View.AddSubview(stack1); 

ответ

1

С одной стороны, вы установили фиксированную ширину и высоту для scroll (будучи равным view.frame). С другой стороны, размер scroll определяется stack1 (на основе его выравнивание, интервалы, свойства распределения и положение scroll в массиве arrangedSubviews)

Таким образом, ограничения противоречат друг другу. Когда вы скрываете stack2 - противоречие исчезает временно, но оно появляется снова, когда stack2 возвращается к просмотру. В этой ситуации система должна игнорировать некоторые противоречивые ограничения (начиная с ограничений, имеющих более низкий приоритет btw), поэтому он решил удалить устройство stack1, чтобы удовлетворить ограничениям высоты и ширины scroll.

Попробуйте удалить эту строку кода: scroll.HeightAnchor.ConstraintEqualTo(frame.Height), Он должен работать.

+0

Когда я удаляю его, я получаю странное поведение. 'stack1' теперь показывает только' stack2' в центре, 'scroll' нигде не видно. когда я переключаю кнопку, появляется «прокрутка», занимает все пространство, а 'stack2' правильно скрывается, но затем я показываю« стеки2 »,« прокрутка »больше не отображается, а« stack2 »возвращается к центру – WindowsMaker

+0

ohhh Я также изменил 'FillProportionally' на' Fill', и он работает :) спасибо! – WindowsMaker

+0

Я рад, что мой ответ хотя бы подсказывал вам решение :) – Miroslav

Смежные вопросы