首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MonoMac上的NSLayoutConstraint动画

MonoMac上的NSLayoutConstraint动画
EN

Stack Overflow用户
提问于 2013-05-02 00:23:28
回答 2查看 363关注 0票数 2

我正在MonoMac中工作,并试图在单击按钮时动态地为控件的宽度和高度约束设置动画。读完以下几页后,我假设我必须使用我的约束的Animator代理。然而,下面的代码似乎并没有完成工作。

NSLayoutConstraint.constant ignoring animation http://cocoa-mono.org/archives/235/using-animator-with-frameorigin/

代码:

代码语言:javascript
复制
// makes sure we animate from 0 to calculated width
double newWidth = ...
widthConstraint.Constant = 0;

var animation = new NSAnimation() { Duration = 0.5, AnimationCurve = NSAnimationCurve.EaseInOut };
widthConstraint.Animations = new NSDictionary("constant", animation);
((NSLayoutConstraint)widthConstraint.Animator).Constant = newWidth;

这样做的结果是控件的宽度为newWidth,但它不是动画形式的--它会立即更改。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-02 23:34:05

原来我用的是错误的动画类型。下面的代码可以工作:

代码语言:javascript
复制
// makes sure we animate from 0 to calculated width
float newWidth, newHeight = ...
widthConstraint.Constant = 0;
heightConstraint.Constant = 30;

var widthAnimation = new CABasicAnimation();
widthAnimation .TimingFunction = CAMediaTimingFunction.FromName(CAMediaTimingFunction.EaseInEaseOut);
widthAnimation .Duration = 0.25;

var heightAnimation = new CABasicAnimation();
widthAnimation .TimingFunction = CAMediaTimingFunction.FromName(CAMediaTimingFunction.EaseInEaseOut);
widthAnimation .Duration = 0.25;

widthConstraint.Animations = new NSDictionary("constant", widthAnimation);
heightConstraint.Animations = new NSDictionary("constant", heightAnimation);

NSAnimationContext.BeginGrouping();
NSAnimationContext.CurrentContext.Duration = widthAnimation.Duration;
NSAnimationContext.CurrentContext.CompletionHandler = new NSAction(() => ((NSLayoutConstraint)heightConstraint.Animator).Constant = newHeight);
((NSLayoutConstraint)widthConstraint.Animator).Constant = newWidth;
NSAnimationContext.EndGrouping();

这将运行宽度动画,然后运行高度动画。

票数 0
EN

Stack Overflow用户

发布于 2013-05-02 22:04:27

你必须实际‘运行’动画。如下所示:

代码语言:javascript
复制
float newWidth = 300;
NSAnimationContext.RunAnimation((ctx) => { 
    ctx.Duration = 0.5;
    ctx.TimingFunction = CAMediaTimingFunction.FromName(CAMediaTimingFunction.EaseInEaseOut);
    ((NSLayoutConstraint)widthConstraint.Animator).Constant = newWidth;
}, () => { 
    Console.WriteLine("Animation Complete"); 
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16322134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档