Как свернуть представление в Xamarin. iOS во время выполнения? - PullRequest
2 голосов
/ 08 января 2020

В Android мы можем использовать ViewStates.Gone для видимости представления, но в iOS, если для свойства Hidden установлено значение false, представление все равно будет занимать пространство. Я использую Auto Layout, поэтому я подумал об изменении ограничений размеров, таких как:

FilterLayout.HeightAnchor.ConstraintEqualTo(0f).Active = true;

Это работает один раз. Но когда я снова пытаюсь расширить представление, вызывая

FilterLayout.HeightAnchor.ConstraintEqualTo(0f).Active = false;

или просто устанавливая новое значение:

FilterLayout.HeightAnchor.ConstraintEqualTo(200f).Active = true;

или записывая обе строки, размер не меняется.

(Размер FilterLayout изначально определяется его подпредставлениями, где вершина первого подпредставления соответствует его topMargin, а нижняя часть последнего подпредставления соответствует его bottomMargin.)

Я даже пытался изменить ограничение соседнего контейнера, поэтому это не так не присоединяется к FilterLayout, и в результате FilterLayout сжимается, и изменение ограничений обратно ничего не делает.

В верхней части страницы находится SearchLayout, ниже FilterLayout, ниже UserSearchList.

Скрытие работ FilterLayout:

FilterLayout.BottomAnchor.ConstraintEqualTo(UserSearchList.TopAnchor).Active = false;
UserSearchList.TopAnchor.ConstraintEqualTo(FilterLayout.BottomAnchor).Active = false;

SearchLayout.BottomAnchor.ConstraintEqualTo(UserSearchList.TopAnchor).Active = true;
UserSearchList.TopAnchor.ConstraintEqualTo(SearchLayout.BottomAnchor).Active = true;

Попытка показать его снова:

SearchLayout.BottomAnchor.ConstraintEqualTo(UserSearchList.TopAnchor).Active = false;
UserSearchList.TopAnchor.ConstraintEqualTo(SearchLayout.BottomAnchor).Active = false;

FilterLayout.BottomAnchor.ConstraintEqualTo(UserSearchList.TopAnchor).Active = true;
UserSearchList.TopAnchor.ConstraintEqualTo(FilterLayout.BottomAnchor).Active = true;

Не имеет значения, если вы установили только одно ограничение вида или оба, результат будет одинаковым .

Ответы [ 2 ]

1 голос
/ 08 января 2020

Я получил ответ от форума Xamarin, и дело в том, что, устанавливая свойство ... Anchor, вы добавляете ограничение, а не модифицируете его, даже если вы пишете ту же строку с .Active = false. Это объясняет, почему макет был изменен в первый раз, но не после.

Вам нужно циклически пройти через ограничения, чтобы удалить один:

foreach (NSLayoutConstraint constraint in FilterLayout.Constraints)
{
    if (constraint.FirstAttribute == NSLayoutAttribute.Height)
    {
        FilterLayout.RemoveConstraint(constraint);
    }
}

Вызов layoutIfNeeded не влияет на это поведение, но использование StackView может быть альтернативным решением.

0 голосов
/ 08 января 2020

Для iOS вам нужно принудительно обновить макет, вызвав layoutIfNeeded после установки ограничений:

https://docs.microsoft.com/en-us/dotnet/api/uikit.uiview.layoutifneeded?view=xamarin-ios-sdk-12

Еще одно предложение - поместить ваши представления в StackViews. Затем, когда вы устанавливаете скрытое свойство для вашего представления внутри StackView, StackView должно автоматически изменить размер до своего размера контента.

...