clipsToBounds заставляет UIImage не отображаться в iOS10 & XCode 8

я переключил свой проект на новые бета-версии iOS 10 и XCode 8. Во всех трех областях моего приложения, где я использую:

imageView.layer.cornerRadius = imageView.frame.size.width/2
imageView.clipsToBounds = true

связанные изображения не отображаются вообще. Я попытался очистить проект, а также папку сборки, перезапустить устройство, попробовать различные симуляторы, повторно добавить imageView, программно установив связанный UIImage вместо выбора одного из активов.

удаление clipsToBounds строка показывает прямоугольное изображение независимо от того,masksToBounds is true или false. Как я могу сделать круговое изображение в XCode8 / iOS10 ?

Edit: проект Swift 2.x и еще не обновлен до синтаксиса Swift 3.0.

10 ответов


у меня была такая же проблема и вызов layoutIfNeeded перед всем закругленным углом / clipsToBounds материал исправил проблему. iOS 10 GM с xcode 8 GM заставляет представления исчезать из-за roundedCorners & clipsToBounds


эта проблема также случилось со мной.

я переместил этот код imageView.layer.cornerRadius = imageView.frame.size.width/2 с - (void)awakeFromNib to - (void)drawRect:(CGRect)rect и эта проблема ушла.

мой imageView имеет размер autolayout. Я думаю, что высота и ширина не определяются при пробуждении от пера на iOS 10.


Это звучит так, как будто это может быть связано с новой ошибкой, так как iOS 10 и Xcode 8, где представления инициализируются размером 1000x1000, и при попытке установить радиус угла в половину вашего кадра, он устанавливает его в 500 вместо этого. Это описано далее в этом вопросе здесь:поскольку Xcode 8 и iOS10, представления не имеют правильного размера в viewDidLayoutSubviews. Моя причина думать, что это исправление проблемы 1000x1000, чтобы вызвать подвиды макета, прежде чем делать что-либо, что требует размеров для что-то, что было построено на interface builder.


у меня была та же проблема. Не отображается на телефоне, но идеально подходит для раскадровки и отладчика пользовательского интерфейса. Он также работал, когда я ставил проект "открывается с Xcode 7" вместо 8, но не был удовлетворительным решением. Поэтому я копнул и выяснил проблему. Проблема заключалась в том, что класс выглядел так:

@IBDesignable public class MyButton: UIButton {

   @IBInspectable var styleName: String = "" {
        didSet {
            switch styleName {
            case "RoundedLight":
                tintColor = UIColor.lightPinkColor()
                layer.borderColor = UIColor.whiteColor().CGColor
                layer.borderWidth = 1
                layer.masksToBounds = true
            default:
                break
            }
        }
    }

    override public func layoutSubviews() {
        super.layoutSubviews()

        switch styleName {
            case "RoundedLight":
                layer.cornerRadius = frame.height / 2
            default:
                break
        }
    }
}

Я изменил его на это, и теперь он работает:

@IBDesignable public class MyButton: UIButton {

   @IBInspectable var styleName: String = "" {
        didSet {
            layoutIfNeeded()
        }
    }

    override public func layoutSubviews() {
        super.layoutSubviews()

        switch styleName {
        case "RoundedLight":
            tintColor = UIColor.lightPinkColor()
            layer.borderColor = UIColor.whiteColor().CGColor
            layer.borderWidth = 1
            layer.cornerRadius = frame.height / 2
            layer.masksToBounds = true
        default:
            break
        }
    }
}

обратите внимание, что ни один из выше работал для меня, и я имею в виду :

  • вызов layoutIfNeeded на layoutSubviews()
  • вызов layoutIfNeeded на awakeFromNib моей кнопки (или моей ячейки, содержащей кнопку)
  • вызов layoutIfNeeded на layoutSubview камеры
  • вызов contentView.layoutIfNeeded() на awakeFromNib камеры
  • вызов view.layoutIfNeeded() на мой взгляд контроллер

у меня был ImageView, который полностью круглой формы. Ниже код :

//MARK:- Misc functions
func setProfileImage() {
    imgProfile.layer.masksToBounds = false
    imgProfile.layer.cornerRadius = imgProfile.frame.size.height/2
    imgProfile.clipsToBounds = true
    imgProfile.contentMode = UIViewContentMode.ScaleToFill
} 

это отлично работает в iOS 9. Однако,in iOS 10 Xcode 8 the ImageView disappears. После отладки обнаружил, что ClipsToBound является виновником.

поэтому разместил код в viewDidLayoutSubviews() решен вопрос.

override func viewDidLayoutSubviews() {
    setProfileImage()
}

вы также можете использовать self.view.layoutIfNeeded()


это может быть проблема макет. Настройка clipToBounds в false будет показывать изображение, даже если его размер равен нулю. Можете ли вы распечатать frame картинки?

если вы выберите cornerRadius и clipToBounds свойства viewDidLoad, попробуйте сделать это в viewDidLayoutSubviews().

вы также можете попробовать позвонить self.view.layoutIfNeeded().


использование obj - c, перемещение синтаксиса из viewDidLoad до viewDidLayoutSubviews работал для меня.


Я просто реализовала галтельные такой

@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

Я всегда правильно закругленные углы. И я не вопросы об обновлении до iOS10 и XCode8


Я думаю, что проблема возникает, потому что мы устанавливаем круглый угол и обрезаем подвиды, как сказал @Pranoy C.

Я решил проблемы, используя layoutIfNeeded для ячейки my tableview, показывающей изображение профиля пользователя. Я хочу, чтобы изображение было круглым углом

код выглядит следующим образом: - (void)awakeFromNib { [super awakeFromNib]; [self layoutIfNeeded];

[self.inputIndicator_imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
self.profile_pic_edit_imageView.layer.cornerRadius = self.profile_pic_edit_imageView.frame.size.width/2;
self.profile_pic_edit_imageView.layer.borderWidth = 1.0;
self.profile_pic_edit_imageView.layer.borderColor = GRAY_COLOR_SUPER_LIGHT.CGColor;
self.profile_pic_edit_imageView.clipsToBounds = YES;}

вы должны вызвать layoutSubviews () в главном представлении перед вызовом imageView.рамка.размер.ширина

[self.view layoutSubviews];
imageView.layer.cornerRadius = imageView.frame.size.width/2
imageView.clipsToBounds = true