动画视图的 alpha 从 0 到 0.5

Posted

技术标签:

【中文标题】动画视图的 alpha 从 0 到 0.5【英文标题】:Animate a view's alpha from 0 to 0.5 【发布时间】:2014-10-05 13:45:41 【问题描述】:

我创建了一个 NSView 作为覆盖视图。在将其添加为另一个视图的子视图后,我想将其 alpha 值从 0 设置为 0.5。我正在执行以下操作,但我从未看到视图的 alpha 动画为 0.5。我知道视图已正确添加,因为如果我将它的背景色设置为具有完整的 alpha,我会看到它。我在这里遗漏了一些简单的东西吗?

self.overlayView = [[MyOverlayView alloc] initWithFrame:frameRect];
self.overlayView.layer.backgroundColor = CGColorCreateGenericRGB(0., 0., 0., 0.0);
[self.window.contentView addSubview:self.overlayView];

__typeof__(self) __weak weakSelf = self;
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) 
     context.duration = 1;
     weakSelf.overlayView.animator.alphaValue = 0;

     completionHandler:^
         weakSelf.overlayView.alphaValue = 0.5;
];

我也试过这样的:

[[self.overlayView animator] setAlphaValue:1.0];

【问题讨论】:

Can't see a new subview 的可能重复项 这不是那个问题的欺骗。我可以看到新的子视图......它只是没有按照我期望的方式制作动画。 只需替换为这一行 [self.window.contentView addSubview:self.overlayView];用这个 [self.window.contentView.animator addSubview:self.overlayView];动画将正常工作 【参考方案1】:

您需要将 wantsLayer 设置为 YES。背景颜色的 alpha 值也应该是 1.0 而不是 0.0。

self.overlayView = [[MyOverlayView alloc] initWithFrame:frameRect];
self.overlayView.wantsLayer=YES;
self.overlayView.layer.backgroundColor = CGColorCreateGenericRGB(0., 0., 0., 1.0);
[self.window.contentView addSubview:self.overlayView];

__typeof__(self) __weak weakSelf = self;
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) 
     context.duration = 1;
     weakSelf.overlayView.animator.alphaValue = 0;

     completionHandler:^
         weakSelf.overlayView.alphaValue = 0.5;
];

【讨论】:

我认为只要改变背景颜色就足够了。视图不需要重新分层来获得不透明的alphaValue,也不需要对其进行动画处理。 如果你设置他正在做的图层的背景颜色,他们需要它。我在发布之前测试了答案。【参考方案2】:

用这一行替换

[self.window.contentView addSubview:self.overlayView];

有了这个

[self.window.contentView.animator addSubview:self.overlayView];

动画会正常工作

【讨论】:

【参考方案3】:

你需要 wantsLayer 在你要动画的视图上,还需要 animator 代理对象

let textField = NSTextField()
textField.wantsLayer = true

NSAnimationContext.runAnimationGroup( context in
  context.duration = 1.0

  textField.stringValue = "\(emoji.visual) copied to clipboard"
  textField.animator().alphaValue = 1.0
, completionHandler: 
   self.textField.alphaValue = 0.0
)

【讨论】:

以上是关于动画视图的 alpha 从 0 到 0.5的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中重复 alpha 动画

如何让 iPhone 屏幕变暗

将带有 alpha 1 的 UIView 放在带有 alpha 0.5 的 UIView 之上

UIView 和子视图 - 不透明度

视图不在屏幕时的 UIView 动画 alpha 不起作用

为啥我不能从另一个控制器中删除视图?