Я тестировал свое приложение с iOS 10 Beta 7 и Xcode 8 beta, и все работало нормально. Однако всего несколько минут назад я установил теперь доступные версии 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.

Я решил это ниже.

38
sudoExclaimationExclaimation 8 Сен 2016 в 01:49

6 ответов

Лучший ответ

Я не уверен, что это новое требование, но я решил это, добавив [self layoutIfNeeded]; перед выполнением каких-либо действий cornerRadius. Итак, мой новый обычай awakeFromNib выглядит так:

- (void)awakeFromNib {
    [super awakeFromNib];
    [self layoutIfNeeded];
    self.tag2label.layer.cornerRadius=self.tag2label.frame.size.height/2;
    self.tag2label.clipsToBounds=YES;
}

Теперь они все в порядке.

75
buczek 4 Окт 2016 в 15:51

Чтобы исправить невидимые виды с cornerRadius = height / 2, создайте категорию UIView + LayoutFix

В файл UIView + LayoutFix.m добавьте код:

- (void)awakeFromNib {
    [super awakeFromNib];
    [self layoutIfNeeded];
}

Добавить категорию в файл YourProject.PCH.

Это будет работать, только если вы использовали [super awakeFromNib] в своих представлениях:

MyView.m

- (void)awakeFromNib {
    [super awakeFromNib];
    ...
}
2
ealee 27 Сен 2016 в 05:57

Я столкнулся с той же проблемой при переходе на TVOS 10. Удаление ограничений автоматической компоновки и использование новых настроек Автоизменения в раскадровках решило эту проблему для меня.

Autoresizing settings panel

Мое наблюдение заключается в том, что iOS 10 / TVOS 10 не выкладывает представления на основе автоматической компоновки перед вызовом awakeFromNib, а раскладывает представления с использованием масок с автоматическим изменением размеров перед вызовом того же метода.

1
Apurva 24 Сен 2016 в 22:47

Вы также можете увидеть представление в иерархии представлений отладки , но не можете увидеть его в приложении.

Необходимо вызвать layoutIfNeeded для затронутого маскированного / обрезанного просмотра.

(Например, если у вас есть UIImageView, и вы используете masksToBounds на его слое, и вы не видите представление в приложении и т. д.)

0
Jakub Truhlář 14 Дек 2016 в 15:59

Вы можете создать подкласс своего представления следующим образом:

@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.

0
andrey.krukovskiy 21 Сен 2016 в 15:31

Сам по себе cornerRadius работает нормально, но размер кадра указан неверно. вот почему layoutIfNeeded устраняет проблему.

1
olx 20 Сен 2016 в 06:14