Какова связь между 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, что заставляет рисовать визуальный контент

для masksToBound установлено значение NO masksToBound установлен в ДА

Я знаю, что этот пост очень старый, но я задал этот вопрос на форумах разработчиков 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, если он доступен.

Другие вопросы по тегам