Какова связь между clipsToBounds UIView и masksToBounds CALayer?
UIView
имеет CALayer
, Это довольно точно. Но оба, кажется, предоставляют то, что означает то же самое.
Если бы я поставил clipsToBounds=YES
, это также установит слой masksToBounds=YES
? Почему разные имена? Кто-нибудь знает?
3 ответа
Это разные имена, потому что UIView
а также CALayer
различны и имеют различную терминологию, связанную с ними, но они функционально эквивалентны. Если вы разберете clipsToBounds
вы увидите это просто звонки masksToBounds
(разборка с фреймворка симулятора, поэтому x86):
-(BOOL)[UIView(Rendering) clipsToBounds]
+0 3091938a 55 pushl %ebp
+1 3091938b 89e5 movl %esp,%ebp
+3 3091938d e800000000 calll 0x30919392
+8 30919392 59 popl %ecx
+9 30919393 8b4508 movl 0x08(%ebp),%eax
+12 30919396 8b5004 movl 0x04(%eax),%edx (CALayer)_layer
+15 30919399 8b8186cb1301 movl 0x0113cb86(%ecx),%eax masksToBounds
+21 3091939f 89450c movl %eax,0x0c(%ebp)
+24 309193a2 895508 movl %edx,0x08(%ebp)
+27 309193a5 c9 leave
+28 309193a6 e92e211801 jmpl 0x31a9b4d9
Кто-то спросил, что произойдет, если clipToBounds имеет значение false, а maskToBounds имеет значение true или может быть лучше, если кто-то добавит скриншоты
Я наткнулся на ту же проблему, где я хотел установить радиус угла и тень для вида.
но это невозможно, потому что как только я устанавливаю masksToBound в YES, он удаляет тень, но обрезает содержимое, а если я устанавливаю его в NO, он показывает тень, но не обрезает содержимое.
Я сделал проект, который объясняет это лучше Понимание ClipToBound и MasksToBound
Я пришел к выводу, что CALayer - это не контейнер, а просто класс, представляющий прямоугольник на экране с визуальным содержимым. каждый рисунок, выполненный в UIView, идет на CALayer, что заставляет рисовать визуальный контент
Я знаю, что этот пост очень старый, но я задал этот вопрос на форумах разработчиков Apple:
В чем разница между
clipsToBounds
в UIView иmasksToBounds
на соответствующем CALayer? Есть ли?При отладке я вижу этот параметр
clipsToBounds = true
в UIView автоматически устанавливаетmasksToBounds = true
на базовом CALayer и наоборот.Насколько я понимаю, UIViews по сути представляют собой облегченную обертку вокруг CALayer, поэтому имело бы смысл, чтобы clipsToBounds за кулисами вызывал маскиToBounds.
Верно ли это предположение?
И получил такой ответ от сотрудников Apple:
Да, в целом UIKit охватывает множество подобных свойств CALayer, хотя и не всегда в «облегченном» виде (но обычно это означает, что есть очень веская причина использовать API UIKit вместо API CALayer, если у вас есть UIView).
Таким образом, мы обычно рекомендуем, чтобы при наличии эквивалентного метода UIView и CALayer для выполнения каких-либо действий вы использовали метод UIView.
Таким образом, даже несмотря на то, что эти два свойства одинаковы (как ответил пользователь Луи Гербарг еще в 2009 году), вам следует предпочесть API UIKit, если он доступен.