使用 UIButton 屏蔽移动的 UIView

Using a UIButton to mask a moving UIView

我想像蒙版一样将两个视图绑定到按钮的边框。我想要的效果如下图

所以我有一个自定义控制器,它使用 PageViewController 在两个 UIViewController 之间滑动。我也有两种观点(红色一种和蓝色一种)。我可以跟踪翻页的方向和程度,所以我可以 link 这两个视图的移动。我需要做的就是对移动的框应用蒙版,以便所有移动都在按钮内。

如果有人知道如何执行此操作,我将永远感激您提供的信息!

你可以在底层使用圆角半径

    CGPoint saveCenter = roundedView.center;
    CGRect newFrame = CGRectMake(roundedView.frame.origin.x, roundedView.frame.origin.y, newSize, newSize);
    button.frame = newFrame;
    button.layer.cornerRadius = newSize / 2.0;
    button.center = saveCenter;

此解决方案可能不是优化的解决方案,但可以按照您的要求进行操作。首先,我想确保我了解您的要求。我知道您想离开红色图像并在具有滑动效果的按钮中引入右侧蓝色图像。

如果我的理解符合你的要求,那就是技巧

  • 首先确定您需要的红色和蓝色图像的哪一部分。这一定很容易,因为您知道转动 UIPageViewController 的方向和程度。
  • 然后使用代码 here.
  • 从红色和蓝色图像中决定部分的裁剪
  • 现在在 coreGraphics 上并排绘制裁剪后的图像(左侧为红色,右侧为蓝色)并检索最终结果图像。
  • 将图像设置为 UIButton。
  • 最后要获得圆形,您可以设置按钮层 属性 的半径 属性。

第三步,如何在coreGraphics上画图&retrieve apple给个详细的解释here

每次您想更新 UIButton 的图像时都必须执行所有这些步骤。可能还有其他好方法可以做到这一点:)

我的理解是你有一个视图,然后你想在它的两个子视图之间通过滑动动画进行过渡。这是相当简单的。

首先将 "Clip Subviews" 设置为 true(在故事板编辑器中或设置 view.clipToBounds=true)。如果你想要一个像你展示的球体,那么设置 layer.cornerRadius = view.frame.size.width/2

您可以只设置子视图的帧 - 使用 UIView animateWithDuration 为它们设置动画或在动画循环中自己设置帧。

前者在代码中(用于滑动第一个元素到左右元素中):

[UIView animateWithDuration:duration animations:^{
    [subview1 setFrame:CGRectMake(-subview1.frame.size.width, 0, subview1.frame.size.width, subview1.frame.size.height)];
    [subview2 setFrame:CGRectMake(0, 0, subview2.frame.size.width, subview2.frame.size.height)];
}];

反向动画类似。如果您在自己的动画循环中执行此操作(这听起来像您想要的),那么您可以很容易地自己进行插值。

如果你想更高级地使用你的面具(即基于图像)然后看这样的东西:How to mask UIViews in iOS