CALayer Border появляется выше subview (похоже, Z-порядок, я думаю)
Я искал, но не смог найти причину такого поведения.
У меня есть UIButton, изображение которого я настраиваю. Вот как должна выглядеть кнопка. Обратите внимание, что это всего лишь фотошоп дизайна предполагаемой кнопки:
![enter image description here]()
По существу, это квадратная пользовательская UIButton с белой рамкой и небольшой окружающей тенью. В правом верхнем углу есть метка "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. Есть ли способ получить предполагаемый эффект?
Спасибо!
Ответы
Ответ 1
Из документов Apple на CALayer
:
Граница вычерчивается из границ приемников с помощью borderWidth. Он составлен над содержимым приемников и подслоями и включает эффекты свойства cornerRadius.
Чтобы получить желаемый эффект, я предлагаю вам поместить изображение в собственный подзаголовок/подуровень и установить свойство подслоя borderWidth
.
Ответ 2
Вы можете установить для слоя zPosition значение -1. Это сработало для меня.
Ответ 3
У меня была аналогичная проблема (я хотел, чтобы пограничная линия не была над моими областями)
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;