clipsToBounds导致的UIImage不要在iOS10和XCode的8

问题描述:

我转我的项目到iOS的10和8的XCode新的测试版本在我的应用程序的所有三个领域,我使用display:clipsToBounds导致的UIImage不要在iOS10和XCode的8

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

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

删除clipsToBounds线显示矩形图像,不管masksToBoundstrue还是false。如何在XCode8/iOS10中制作圆形图像?

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

+0

所以它删除了clipsToBounds设置语句,并在cornerRadius停止影响再次成为直角的ImageView和你的形象? – ddb

+0

@ddb是的,删除clipsToBounds语句后,图像是矩形的并且是可见的。 – cloudcal

+1

这样的回答:http://*.com/questions/39380128/ios-10-gm-with-xcode-8-gm-causes-views-to-disappear-due-to-roundedcorners建议呼吁self.layoutIfNeeded –

我有同样的问题,并呼吁layoutIfNeeded之前所有的圆角/ clipsToBounds东西解决了问题。 iOS 10 GM with xcode 8 GM causes views to disappear due to roundedCorners & clipsToBounds

+0

解决方案为我工作的ios 10.谢谢你&+1太.. – bittu

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

如果您在viewDidLoad中设置cornerRadiusclipToBounds属性,请尝试在viewDidLayoutSubviews()中执行此操作。

您也可以尝试致电self.view.layoutIfNeeded()

+0

我最初尝试在viewDidLoad和viewDidAppear中设置圆角半径和clipsToBounds,但没有结果。我试图与viewDidLayoutSubviews无济于事。 当我进入调试视图层次结构时,我可以看到被绘制的UIImageView中的UIImage框架 - 只是没有显示图像。 它也值得一提(我忘了在我的原始发布),该项目仍是Swift 2.x,并没有更新到Swift 3.0语法。 – cloudcal

+0

打印帧产量:(137.5,24.0,100.0,100.0) – cloudcal

你应该叫imageView.frame.size.width

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

您不应该手动调用'layoutSubviews'。致电'layoutIfNeeded'而不是 – Thorax

这个问题也发生在我身上之前调用layoutSubviews()主视图。

我将这些代码imageView.layer.cornerRadius = imageView.frame.size.width/2- (void)awakeFromNib改为- (void)drawRect:(CGRect)rect并且此问题消失。

我的imageView通过自动布局调整大小。我认为,当从iOS 10的笔尖醒来时,高度和宽度并不是决定的。

+0

为我工作!谢谢 –

+0

omg ..这样一个简单的灵魂.. +1 ..谢谢:) –

使用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为我的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;} 

我有同样的问题。没有在手机上显示,但完美的故事板和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 
     } 
    } 
} 

注意,没有以上的工作对我来说,我的意思是:

  • layoutSubviews()
  • 调用layoutIfNeededawakeFromNib调用layoutIfNeeded我的按钮(或包含按钮我的小区)
  • 在我的小区的layoutSubview
  • 在我的细胞
  • 在我的视图控制器调用view.layoutIfNeeded()

这声音的awakeFromNib调用contentView.layoutIfNeeded()调用layoutIfNeeded就像它可能是由于iOS 10和Xcode 8的一个新bug导致视图初始化为1000x1000,并且尝试将角半径设置为帧的一半时,它将其设置为500。这里在这个问题上进一步记录:Since Xcode 8 and iOS10, views are not sized properly on viewDidLayoutSubviews。我之所以这样想,是因为在做任何需要在界面构建器上构建的东西的大小之前调用布局子视图的1000x1000问题的修复。

我的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()