clipsToBounds 导致 UIImage 不显示在 iOS10 & XCode 8

clipsToBounds causes UIImage to not display in iOS10 & XCode 8

我将我的项目切换到 iOS 10 和 XCode 8 的新测试版。在我使用的应用程序的所有三个区域中:

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

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

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

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

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

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

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

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

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

这个问题也发生在我身上

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

我的 imageView 由自动布局调整大小。我认为在 iOS 10.

上从笔尖唤醒时高度和宽度没有确定

我遇到了同样的问题,在所有圆角/clipsToBounds 之前调用 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 的说法设置了圆角和裁剪子视图。

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

代码如下: - (void)awakeFromNib { [超级 awakeFromNib]; [自行布局IfNeeded];

[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;}

我遇到了同样的问题。未在 phone 上显示,但在 Storyboard 和 UI 调试器上完美显示。当我将项目 "Opens with Xcode 7" 而不是 8 时,它也能正常工作,但不是一个令人满意的解决方案。所以我挖掘并发现了问题所在。问题是 class 看起来像这样:

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

请注意,上面的 none 对我有用,我的意思是:

  • layoutSubviews()
  • 中调用 layoutIfNeeded
  • 在我的按钮(或包含该按钮的单元格)的 awakeFromNib 中调用 layoutIfNeeded
  • 在我的手机 layoutSubview 中调用 layoutIfNeeded
  • 在我的手机 awakeFromNib 中呼叫 contentView.layoutIfNeeded()
  • 在我的视图控制器中调用 view.layoutIfNeeded()

这听起来可能是由于 iOS 10 和 Xcode 8 以来的一个新错误,其中视图以 1000x1000 大小初始化,并且在尝试将角半径设置为框架的一半时,它而是将其设置为 500。这在此处的问题中有进一步记录:。我认为这是对 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()