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 на его слое, и вы не видите вид в приложении и т.д.)