Граница CALayer появляется над подпредставлением (я думаю, что это связано с Z-порядком) - PullRequest
15 голосов
/ 28 марта 2012

Я искал, но не смог найти причину такого поведения.

У меня есть кнопка UIB, изображение которой я настраиваю.Вот как должна выглядеть кнопка.Обратите внимание, что это всего лишь фотошоп предполагаемого дизайна кнопок:

enter image description here

По сути, это квадратная пользовательская кнопка UIB с белой рамкой и небольшой окружающей тенью.В верхнем правом углу есть метка «X», которая будет добавлена ​​программным способом как подпредставление.

Вот скриншот кнопки внутри самого приложения.На данный момент я только добавил тень и отметку X в качестве подпредставления:

enter image description here

Как, когда я пытаюсь добавить белую рамку, вот как это выглядит:

enter image description here

Кажется, что белая граница появляется над подуровнем метки X.Я не знаю почему.

Вот код, который я использую:

// selectedPhotoButton is the UIButton with UIImage set earlier
// At this point, I am adding in the shadow
[selectedPhotoButton layer] setShadowColor:[[UIColor lightGrayColor] CGColor]];
[[selectedPhotoButton layer] setShadowOffset: CGSizeMake(1.0f, 1.0f)];
[[selectedPhotoButton layer] setShadowRadius:0.5f];
[[selectedPhotoButton layer] setShadowOpacity:1.0f]; 

// Now add the white border    
[[selectedPhotoButton layer] setBorderColor:[[UIColor whiteColor] CGColor]];
[[selectedPhotoButton layer] setBorderWidth:2.0];

// Now add the X mark subview
UIImage *deleteImage = [UIImage imageNamed:@"nocheck_photo.png"];
UIImageView *deleteMark = [[UIImageView alloc] initWithFrame:CGRectMake(53, -5, 27, 27)];
deleteMark.contentMode = UIViewContentModeScaleAspectFit;
[deleteMark setImage:deleteImage];
[selectedPhotoButton addSubview:deleteMark];
[deleteMark release];

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

Спасибо!

Ответы [ 3 ]

16 голосов
/ 28 марта 2012

Из документов Apple на CALayer:

Граница рисуется вставкой из границ получателя с помощью borderWidth. Он размещается над содержимым и подуровнями получателя и включает в себя эффекты свойства cornerRadius.

Чтобы получить нужный эффект, я предлагаю вам поместить изображение в собственный подпредставитель / подслой и установить свойство borderWidth этого подслоя.

4 голосов
/ 27 октября 2016

Вы можете установить zPosition слоя на -1.Это сработало для меня.

2 голосов
/ 12 сентября 2014

У меня была похожая проблема (я хотел не допустить, чтобы граница была поверх моих подпредставлений)

CAShapeLayer * _border = [CAShapeLayer layer];
_border.strokeColor = [UIColor colorWithRed:119/255.0f green:119/255.0f blue:119/255.0f alpha:1.0f].CGColor;
_border.fillColor = nil;
[bgRoundView.layer addSublayer:_border];
_border.path = [UIBezierPath bezierPathWithRoundedRect:bgRoundView.bounds cornerRadius:20.f].CGPath;
...