IOS 10 GM с xcode 8 GM заставляет взгляды исчезать из-за закругленных углов и клипов.
Я протестировал свое приложение с бета-версией IOS 10 Beta 7 и Xcode 8, и все было хорошо. Однако всего несколько минут назад я установил теперь доступные выпуски GM обоих и столкнулся с странной проблемой.
Я использую пользовательские ячейки представления таблицы в своем приложении и в своей настраиваемой ячейке Я использую cornerRadius
и clipsToBounds
для создания округленных представлений.
- (void)awakeFromNib {
[super awakeFromNib];
self.tag2label.layer.cornerRadius=self.tag2label.frame.size.height/2;
self.tag2label.clipsToBounds=YES;
}
Это выглядело хорошо, прежде чем, однако, в новом GM выпустят все виды, у которых закругленные углы исчезли. Это произошло с UIView
, UILabels
и UIButtons
.
Я решил это ниже.
Ответы
Ответ 1
Я не уверен, что это новое требование, но я решил это, добавив [self layoutIfNeeded];
, прежде чем делать какие-либо вещи cornerRadius
. Итак, мой новый пользовательский awakeFromNib
выглядит так:
- (void)awakeFromNib {
[super awakeFromNib];
[self layoutIfNeeded];
self.tag2label.layer.cornerRadius=self.tag2label.frame.size.height/2;
self.tag2label.clipsToBounds=YES;
}
Теперь все выглядит нормально.
Ответ 2
Исправить невидимые виды с помощью cornerRadius = height/2 create category UIView + LayoutFix
В файле UIView + LayoutFix.m добавить код:
- (void)awakeFromNib {
[super awakeFromNib];
[self layoutIfNeeded];
}
добавить категорию в файл YourProject.PCH.
Он будет работать, только если вы использовали [super awakeFromNib] в своих представлениях:
MyView.m
- (void)awakeFromNib {
[super awakeFromNib];
...
}
Ответ 3
cornerRadius
сам работает отлично, но размер в кадре сообщается неправильно. поэтому layoutIfNeeded
устраняет проблему.
Ответ 4
Я столкнулся с такой же проблемой при переходе на TVOS 10. Удаление ограничений автоматического макета и использование новых настроек Авторезистировка в раскадках разрешили это для меня.
![Панель настроек авторезистов]()
Мое наблюдение заключается в том, что iOS 10/TVOS 10 не выкладывает автомасштабируемые представления перед вызовом awakeFromNib, но выкладывает представления, используя авторезистирующие маски, прежде чем вызывать тот же метод.
Ответ 5
Вы можете создать подкласс вашего представления следующим образом:
@implementation RoundImageView
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
self.layer.masksToBounds = YES;
self.layer.cornerRadius = MIN(self.bounds.size.height, self.bounds.size.width)/2;
[self addObserver:self
forKeyPath:@"bounds"
options:NSKeyValueObservingOptionNew
context:(__bridge void * _Nullable)(self)];
}
return self;
}
-(void)dealloc
{
[self removeObserver:self
forKeyPath:@"bounds"
context:(__bridge void * _Nullable)(self)];
}
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary<NSString *,id> *)change
context:(void *)context
{
if(context == (__bridge void * _Nullable)(self) && object == self && [keyPath isEqualToString:@"bounds"])
{
self.layer.cornerRadius = MIN(self.bounds.size.height, self.bounds.size.width)/2;
}
}
@end
чтобы у вас всегда были закругленные углы.
Я использую этот подход и не обновляю до Xcode8 и iOS10.
Ответ 6
Вы также можете увидеть представление в иерархии представления отладки, но не можете увидеть его в приложении.
Вы должны вызвать layoutIfNeeded
на зараженном скрытом/обрезаемом представлении.
(Например, если у вас есть UIImageView
, а вы masksToBounds
на его слое, и вы не видите вид в приложении и т.д.)