移动CALayer位置完全被超级CALayer封装

Posted

技术标签:

【中文标题】移动CALayer位置完全被超级CALayer封装【英文标题】:Move CALAyer position to be entirely encapsulated by super CALayer 【发布时间】:2015-04-20 09:39:07 【问题描述】:

我有两个 CALayer,一个要拖到另一个中。如果拖动的 CALayer 不完全在目标 CALayer 内,我想将它移动到它(不是到设定点,只是到可能关闭的点,这意味着该层完全在目标层内)。我真的不确定是否有一种简单的方法可以实现这一目标?

我正在检查以下内容,

if (!CGRectContainsRect(destinationLayer.frame, draggedLayer.frame)) 

                NSLog(@"Not completely with container");
            

谢谢

【问题讨论】:

【参考方案1】:

首先,您应该确保移动层必须小于外部层。

然后,如果它在左侧,则可以使 min x 等于外部的 min x,如果在另一侧,则可以使 max x 等于 max x。

y 轴方向相同。

//x轴代码如下,y轴类似

if in.frame.origin.x < out.frame.origin.x 
    in.frame.origin = out.frame.origin.x //In objective-c you cannot set it directly like this, it only works in swift!!!!
 else if in.frame.origin.x > out.frame.origin.x 
    in.frame.origin = out.frame.origin.x

我认为这是最简单的方法。另外你应该注意transform,因为frame是一个计算属性,它是图层的边界框,所以这个过程和上面的没有什么不同。

【讨论】:

感谢您的回复,我将如何设置最小 x 位置?例子会很有帮助 我补充一点,如果你使用objective-c,请和之前一样注意设置的框架代码,swift代码在objective-c中不起作用。

以上是关于移动CALayer位置完全被超级CALayer封装的主要内容,如果未能解决你的问题,请参考以下文章

如何检测两个 CALayer 是不是重叠?

动画 CALayer

CALayer 和 drawRect

CALayer 详解

UIVIew/CALayer 动画期间的回调

将 CALayer 更改应用到 UIView