2

我们有一个 iOS,我们目前正在制作动画以将包含视图上的 alpha 设置为 0。像这样:

[UIView animateWithDuration:1.0f animations:^{
 self.jtContained.view.alpha = 1.0f;
}];

self.jtContained 是一个包含的控制器,代表其容器控制器的下半部分;这将删除此包含的控制器中的所有触摸功能。我们认为在这个包含的控制器上本质上具有动画蒙版可能更直观。这是我们想要的快速 5 分钟的 photoshop(即不是将其动画化,而是屏蔽掉包含的控制器):

在此处输入图像描述

是否有使用 UIView 动画或核心动画的预构建方式来执行此操作?我什至想只遍历视图并将像素设置为 0。对不起,如果这是一个幼稚的问题,但我发现一些核心动画文档势不可挡。

提前谢谢

4

2 回答 2

2

您要做的是创建一个 CAShapeLayer 并使其成为视图层的遮罩层。然后将 CGPath 添加到作为视图全尺寸的形状层。(您将创建一条路径,该路径从视图的一个角开始,并围绕这些角绕一圈移动,从而创建一条矩形路径。)

当您想掩盖您的视图时,您可以将路径替换为另一个面积为零的矩形路径。(第一条路径可能会从 top_left、top_right、bottom_right、bottom_left、close 绕过拐角。空路径会去 top_left、top_right、top_left、top_right、close。)

Core Animation 将对定义形状层的路径的更改进行动画处理,并且由于路径是视图层的蒙版,因此蒙版会进行动画处理,从而隐藏您的视图。

正确制作此动画的关键是起始路径和结束路径必须具有相同数量的点。这就是我描述创建一个 4 点路径和另一个 EMPTY 4 点路径的原因。当你这样做时,Core Animation 会为点的移动设置动画,你会得到你想要的效果。如果您的起点和终点路径具有不同数量的控制点,或者控制点的顺序不同,则“结果未定义”并且通常根本不是您想要的。

你要问的是一个显示动画,这与我上面描述的相反。

我在 github 上有一个名为iOS-CAAnimation-group-demo的演示项目(链接),它展示了这个想法。查看“蒙版动画”按钮后面的代码。该代码创建了一个“时钟擦除”动画,这比您想要做的简单显示要复杂得多。

PS如果这篇文章对您有帮助,请记得将其标记为回答您的问题(并投票。)

于 2013-02-23T21:39:51.500 回答
2

要详细说明以前的答案,您可以通过为蒙版使用的 CALayer 框架设置动画来做到这一点。如果它只是一个矩形遮罩,则不需要 CGPath。我们可以重用我们要隐藏的视图的框架。例子:

// Get the frame of the view's layer we're going to mask
let frame = viewToHide.layer.frame

// Create a new layer for our mask
// Masks are based on the "alpha" of the layer so if there is no background
// the mask won't cover anything so need to make sure we set that.
let mask = CALayer()
mask.backgroundColor = UIColor.whiteColor().CGColor
mask.frame = CGRectMake(0.0, 0.0, frame.width, frame.height)

// Set our new layer as the mask of the view we want to hide.
self.viewToHide.layer.mask = mask

UIView.animateWithDuration(1.0, animations: {() -> Void in

    // We keep the width of the new frame the same so
    // it looks like it's "rolling" up. Then we change the
    // height to 0.0, effectively making the mask not cover anything
    mask.frame = CGRectMake(0.0, 0.0, frame.width, 0.0)
})
于 2015-11-29T20:45:36.027 回答