clipsToBounds导致UIImage无法在iOS10和XCode 8中显示

我将我的项目切换到iOS 10和XCode 8的新testing版。在我使用的应用程序的所有三个方面:

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

关联的图像根本不显示。 我试图清理项目以及生成文件夹,重新启动设备,尝试各种模拟器,重新添加imageView,以编程方式设置相关的UIImage而不是从资产中select一个。

无论masksToBoundstrue还是false移除clipsToBounds行都会显示矩形图像。 如何在XCode8 / iOS10中制作圆形图像?

编辑:项目是Swift 2.x,但尚未更新为Swift 3.0语法。

我有同样的问题,并呼吁layoutIfNeeded之前,所有的圆angular/ clipsToBounds东西解决了这个问题。 使用xcode 8 GM的iOS 10 GM会导致视图由于roundedCorners&clipsToBounds而消失

这个问题也发生在我身上。

我把这些代码imageView.layer.cornerRadius = imageView.frame.size.width/2- (void)awakeFromNib- (void)drawRect:(CGRect)rect ,这个问题就消失了。

我的imageView通过自动布局进行大小调整。 我认为,从iOS 10的笔尖醒来时,高度和宽度都没有决定。

我有同样的问题。 没有显示在手机上,但完美的故事板和UIdebugging器。 当我把这个项目“用Xcode 7打开”而不是8个项目的时候,它也在工作,但这不是一个令人满意的解决scheme。 于是我挖掘并发现了这个问题。 麻烦的是一个类似这样的:

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

请注意,以上都没有为我工作,我的意思是:

  • layoutSubviews()调用layoutIfNeeded
  • 在我的button的awakeFromNib (或包含button的单元格)中调用layoutIfNeeded
  • 在我的单元格的layoutSubview中调用layoutIfNeeded
  • 在我的单元的awakeFromNib中调用contentView.layoutIfNeeded()
  • 在我的视图控制器中调用view.layoutIfNeeded()

这听起来可能是由于iOS 10和Xcode 8的一个新bug,其中视图初始化的大小为1000×1000,当试图将angular半径设置为帧的一半时,它将其设置为500。 在这个问题在这里进一步logging: 由于Xcode 8和iOS10,viewDidLayoutSubviews上的视图大小不正确 。 我之所以这样想,是因为在做任何需要在界面构build器上构build的东西的大小之前调用布局子视图的1000×1000问题的修复。

我的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. debugging后发现ClipsToBound是罪魁祸首。

所以放在viewDidLayoutSubviews()的代码解决了这个问题。

 override func viewDidLayoutSubviews() { setProfileImage() } 

你也可以使用self.view.layoutIfNeeded()

这可能是一个布局问题。 将clipToBounds设置为false将显示图像,即使其大小为零。 你能打印你的图像的frame

如果您在viewDidLoad设置了cornerRadiusclipToBounds属性,请尝试在viewDidLayoutSubviews()

你也可以尝试调用self.view.layoutIfNeeded()

使用obj-c,将语法从viewDidLoad移到viewDidLayoutSubviews为我工作。

我刚刚实施了这样的angular落四舍五入

 @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 

所以我总是有适当的圆angular。 我没有升级到iOS10和XCode8的问题

我认为问题的发生是因为我们设置了圆angular和剪辑子视图为@Pranoy C说。

我通过使用layoutIfNeeded为我的tableview单元格显示用户的个人资料图片解决了问题。 我想确保图像是圆angular

代码如下: – (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;} 

在调用imageView.frame.size.width之前,您应该在主视图上调用layoutSubviews()

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