Анимация константы ограничения макета из одного значения в другое с помощью Xamarin.ios

Я использую студию Xamarin и разрабатываю приложение для iPad с помощью Xamarin.iOS.

Я устанавливаю постоянное значение для выхода ограничения макета в моем файле С#.

Что у меня есть на данный момент (без анимации)

_myRightSpaceConstraint.Constant = 50;

Что я хочу

Анимируйте эту константу так, чтобы она шла от:

_myRightSpaceConstraint.Constant = 300;

to

_myRightSpaceConstraint.Constant = 50;

ИЛИ, аналогично предыдущему, но не указывая начальную константу (300), вместо этого я просто беру то, что установлено в файле xib, и анимирую до 50.

Возможно ли это сделать в Xamarin, и если да, то есть ли примеры кода, которые мне помогут?

Что я пробовал - что не работает

UIView.BeginAnimations ("slideAnimation");
float _pt;
_pt = _myRightSpaceConstraint.Constant;

UIView.SetAnimationDuration (5);
UIView.SetAnimationCurve (UIViewAnimationCurve.EaseInOut);

UIView.SetAnimationDelegate (this);
UIView.SetAnimationDidStopSelector (
    new Selector ("slideAnimationFinished:"));

_myRightSpaceConstraint.Constant = 50;
UIView.CommitAnimations ();

Это фактически успешно устанавливает константу на 50, но без анимации.

Изменить/обновить:

Мне удалось добиться того, чего я хотел, со следующим:

_myRightSpaceConstraint.Constant = 150;
_myViewWithTheConstraint.SetNeedsUpdateConstraints ();

UIView.BeginAnimations ("slideAnimation");

UIView.SetAnimationDuration (1);
UIView.SetAnimationCurve (UIViewAnimationCurve.EaseInOut);

UIView.SetAnimationDelegate (this);
UIView.SetAnimationDidStopSelector (
    new Selector ("slideAnimationFinished:"));

_myViewWithTheConstraint.LayoutIfNeeded ();

UIView.CommitAnimations ();

Ключевой была следующая строка:

_myViewWithTheConstraint.LayoutIfNeeded ();

person Dave Haigh    schedule 18.10.2013    source источник


Ответы (2)


Вызовите LayoutIfNeeded() для ограниченных представлений как часть действия animations UIView.Animate:

    NSLayoutConstraint[] dynConstraints;
    UIView redView;
    UIView greenView;

    public ContentView()
    {
        BackgroundColor = UIColor.Blue;

        redView = new UIView() {
            BackgroundColor = UIColor.Red,
            TranslatesAutoresizingMaskIntoConstraints = false
        };
        AddSubview(redView);

        greenView = new UIView(){
            BackgroundColor = UIColor.Green,
            TranslatesAutoresizingMaskIntoConstraints = false
        };
        AddSubview(greenView);

        var viewsDictionary = new NSMutableDictionary();
        viewsDictionary["red"] = redView;
        viewsDictionary["green"] = greenView;

        dynConstraints= NSLayoutConstraint.FromVisualFormat("V:|-[red]-100-[green(==red)]-|", 0, new NSDictionary(), viewsDictionary);
        AddConstraints(dynConstraints);
        AddConstraints(NSLayoutConstraint.FromVisualFormat("H:|-[red]-|", 0, new NSDictionary(), viewsDictionary));
        AddConstraints(NSLayoutConstraint.FromVisualFormat("H:|-[green(==red)]", 0, new NSDictionary(), viewsDictionary));

        this.UserInteractionEnabled = true;
    }

    public override void TouchesBegan(NSSet touches, UIEvent evt)
    {
        foreach(var constraint in dynConstraints)
        {
            constraint.Constant = 50;
        }
        UIView.Animate(0.5, () => {
            redView.LayoutIfNeeded();
            greenView.LayoutIfNeeded();
        });
    }
person Larry OBrien    schedule 19.10.2013

Мне удалось добиться того, чего я хотел, со следующим:

_myRightSpaceConstraint.Constant = 150;
_myViewWithTheConstraint.SetNeedsUpdateConstraints ();

UIView.BeginAnimations ("slideAnimation");

UIView.SetAnimationDuration (1);
UIView.SetAnimationCurve (UIViewAnimationCurve.EaseInOut);

UIView.SetAnimationDelegate (this);
UIView.SetAnimationDidStopSelector (
    new Selector ("slideAnimationFinished:"));

_myViewWithTheConstraint.LayoutIfNeeded ();

UIView.CommitAnimations ();

Ключевой была следующая строка:

_myViewWithTheConstraint.LayoutIfNeeded ();
person Dave Haigh    schedule 21.10.2013
comment
Не могу вспомнить. Кто такой Ларри? - person Dave Haigh; 01.10.2015
comment
Тот, кто ответил на этот вопрос выше. Вы прокомментировали его ответ, сказав, что он решил проблему, но затем вы написали свой собственный ответ и приняли его как решение. Почему вы не приняли ответ, который вам дали? - person Cogwheel; 01.10.2015
comment
@Cogwheel это было давно, но, просматривая этот пост, кажется, что Ларри жестко запрограммировал ограничения и значения в коде. Я хотел обновить настройку выхода ограничений в файле xib. он не сказал, что его ответ решил мою проблему, я прокомментировал, что его упоминание о LayoutIfNeeded() помогло мне. Я принял свое как решение, которое я в итоге использовал. - person Dave Haigh; 05.10.2015
comment
В своем ответе вы говорите, что ключом была следующая строка: _myViewWithTheConstraint.LayoutIfNeeded(). Именно это и было сказано в ответе Ларри в самом первом предложении. Код, который он предоставил, был просто примером. Общая идея вызова LayoutIfNeeded является реальным ответом на этот вопрос, а не какой-то конкретный код, который вы получили. Вы, кажется, скучаете по лесу из-за деревьев здесь. - person Cogwheel; 05.10.2015