Я столкнулся с той же проблемой и нашел много решений, но ни одно из них не является идеальным.
Наконец из ответа выше от pnavk я получил идею. Там код для пользователей Xamarin / C #.
Версия iOS может быть такой:
Swift 2,3
if rootLayer.sublayers?.count > 0 {
rootLayer.sublayers?.forEach {
if $0.name == "bottomBorderLayer" {
$0.removeFromSuperlayer()
}
}
}
let border = CALayer()
let height = CGFloat(1.0)
border.borderColor = UIColor.blackColor().CGColor
border.borderWidth = height
border.frame = CGRectMake(0, self.frame.size.height - height, self.frame.size.width, self.frame.size.height)
border.name = "bottomBorderLayer"
rootLayer.addSublayer(border)
rootLayer.masksToBounds = true
Objective-C
if (rootLayer.sublayers.count > 0) {
for (CALayer *layer in rootLayer.sublayers) {
if ([layer.name isEqualToString:@"bottomBorderLayer"]) {
[layer removeFromSuperlayer];
}
}
}
CALayer *border = [[CALayer alloc] init];
CGFloat height = 1.0;
border.borderColor = [UIColor blackColor].CGColor;
border.borderWidth = height;
border.frame = CGRectMake(0, self.view.frame.size.height - height, self.view.frame.size.width, self.view.frame.size.height);
border.name = @"bottomBorderLayer";
[rootLayer addSublayer:border];
rootLayer.masksToBounds = TRUE;
Приведенный выше код будет работать только для нижней границы. Вы можете изменить границу в соответствии с вашим требованием.
Здесь, прежде чем добавлять какой-либо слой в контроллер, я просто запустил цикл for, чтобы проверить, применена ли уже граница или нет?
Для идентификации ранее добавленной границы я использую свойство name CALayer. И сравните этот слой перед удалением из подслоев.
Я пробовал тот же код, прежде чем использовать имя свойства, но он создает случайный сбой. Но после использования свойства name и сравнения имени перед удалением это решит проблему сбоя.
Надеюсь, это кому-нибудь поможет.