Переместите позицию CALayer, чтобы она была полностью инкапсулирована супер CALayer

У меня есть два CALayer, один из которых нужно перетащить в другой. Если перетаскиваемый CALayer не полностью находится в целевом CALayer, я хочу переместить его так, чтобы он был (не в заданную точку, а только в закрытую возможную точку, которая будет означать, что слой полностью находится в целевом слое). Я действительно не уверен, есть ли простой способ добиться этого?

Я проверяю следующее,

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

                NSLog(@"Not completely with container");
            }

Спасибо


person geoBApp    schedule 20.04.2015    source источник


Ответы (1)


  • Прежде всего, вы должны убедиться, что перемещаемый слой должен быть меньше внешнего.

  • Затем вы можете просто сделать min x равным min x внешнего, если он слева, или max x до max x, если он на другой стороне.

  • То же самое с осью Y.

//Код x-aixs показан ниже, ось 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
}

Я думаю, это самый простой способ. Также вам следует обратить внимание на преобразование, поскольку фрейм является вычисляемым свойством, которое является ограничивающей рамкой слоя, поэтому процедура не будет отличаться от описанной выше.

person user3349433    schedule 20.04.2015
comment
спасибо за ответ, как мне установить позицию min x? Пример был бы очень полезен - person geoBApp; 20.04.2015
comment
Я добавляю больше деталей, если вы используете target-c, обратите внимание на установленный код кадра, как вы делали раньше, быстрый код не будет работать в target-c. - person user3349433; 20.04.2015