Как предотвратить отсечение подвидов, когда я устанавливаю угловой радиус UIView?

Я пытаюсь установить angleRadius представления подкласса UIButton, круглый угол отображается правильно, но когда я пытаюсь добавить к нему subView (значок цветка), кажется, что subview обрезается, как изображение на правая сторона ниже, это не то, что я ожидал. Я пытаюсь сделать правильный внешний вид, как показано на рисунке слева, значок не обрезается. Код, который я использую:

button.layer.cornerRadius = button.frame.width / 2;
button.layer.masksToBounds = Yes;    

Вид аватара (слева)Вид аватара (справа)

Надеюсь, кто-нибудь поможет мне понять, как предотвратить отсечение.
Спасибо!


person trey.lin    schedule 25.06.2015    source источник
comment
Вы НЕ ДОЛЖНЫ создавать подклассы класса UIButton вопросы/13202161/   -  person Benjamin Jimenez    schedule 26.06.2015


Ответы (2)


Тогда вам не следует добавлять наложение в качестве подпредставления. Подпредставления будут обрезаны, если вы установите clipsToBounds на YES.

Вместо этого добавьте его как брата, например:

- container view
  - image view (clips)
  - overlay view
person Christian Schnorr    schedule 25.06.2015
comment
Спасибо! Но в данном случае это представление аватара является подклассом UIButton, аватар задается каким-то URL с использованием какой-то сложной логики, поэтому, если мне нужно будет его рефакторить, у него будет много работы... - person trey.lin; 25.06.2015

Если вы делаете кнопку закругленной, используя вышеупомянутый код, ваша кнопка определенно будет обрезана с углов, поэтому, если вы хотите отрезать ее только с трех углов, сделайте следующее:

#import <QuartzCore/CoreAnimation.h>

UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:button.bounds 
                                           byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight | UIRectCornerBottomLeft
                                                 cornerRadii:CGSizeMake(7.0, 7.0)];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = button.bounds;
maskLayer.path = maskPath.CGPath;
button.layer.mask = maskLayer;
person Pankaj Wadhwa    schedule 25.06.2015
comment
Спасибо! Это быстрое решение, но... дизайнер отклонил его, потому что внешний вид не соответствует его ожиданиям :-( - person trey.lin; 25.06.2015
comment
нет проблем. Вы можете спросить своего дизайнера, что именно он/она хочет.. может быть, я могу помочь. - person Pankaj Wadhwa; 25.06.2015
comment
Как видно на картинке, я имею в виду картинку слева в вопросе, это то, что ожидает дизайнер... - person trey.lin; 26.06.2015