2016-08-25 1 views
28

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

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

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

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

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

+0

так вы удалите clipsToBounds настройки заявление, делает cornerRadius остановки влияет на ImageView и изображение станет снова прямоугольным? – ddb

+0

@ddb да, после удаления инструкции clipBoop, изображение прямоугольное и видно. – cloudcal

+1

Этот ответ: http://stackoverflow.com/questions/39380128/ios-10-gm-with-xcode-8-gm-causes-views-to-disappear-due-to-roundedcorners предлагает позвонить self.layoutIfNeeded –

ответ

0

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

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

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

+0

Первоначально я попытался установить угловой радиус и clipToBounds как в viewDidLoad, так и в viewDidAppear без результата. Я попытался с viewDidLayoutSubviews безрезультатно, как welll. Когда я вхожу в иерархию представления отладки, я вижу рамку для UIImage в чертеже UIImageView - просто изображение не отображается. Также стоит упомянуть (я забыл в своей первоначальной публикации), что проект по-прежнему Swift 2.x и не обновлен до синтаксиса Swift 3.0. – cloudcal

+0

печать кадра дает: (137.5, 24.0, 100.0, 100.0) – cloudcal

-1

Вы должны вызвать layoutSubviews() на главном экране перед вызовом imageView.frame.size.width

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

Вы никогда не должны вызывать 'layoutSubviews' вручную. Вызов 'layoutIfNeeded' вместо – Thorax

6

Эта проблема также произошло со мной.

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

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

+0

Работал для меня! спасибо –

+0

omg .. такая простая душа .. +1 .. спасибо :) –

0

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

0

Я просто реализовать закругления углов, как этот

@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

0

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

Я решил проблемы, используя layoutIfNeeded для ячейки 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;} 
1

У меня была та же проблема. Не показывать по телефону, но идеально подходит для отладки раскадровки и UI. Он также работал, когда я запускал проект «Открывается с 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 моей кнопки (или моя ячейка, содержащая кнопки)
  • Calling layoutIfNeeded в layoutSubview моей камеры
  • Calling contentView.layoutIfNeeded() в awakeFromNib моей камеры
  • Calling view.layoutIfNeeded() на мой взгляд, контроллер
2

Это звучит как это может быть связано с новой ошибкой с iOS 10 и Xcode 8, где представления инициализируются размером 1000x1000 и при попытке установить радиус угла до половины вашего кадра, вместо этого он устанавливает значение 500. Это далее описано в этом вопросе: Since Xcode 8 and iOS10, views are not sized properly on viewDidLayoutSubviews. Моя причина в том, чтобы подумать об этом, - это исправление проблемы 1000x1000, чтобы вызвать вызовы макета, прежде чем делать что-либо, требующее размеров для чего-то, что было построено на построителе интерфейса.

1

У меня был 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 
} 

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

Поэтому размещенный код в viewDidLayoutSubviews() разрешил проблему.

override func viewDidLayoutSubviews() { 
    setProfileImage() 
} 

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

 Смежные вопросы

  • Нет связанных вопросов^_^