clipsToBounds causes UIImage to not display in iOS10 & XCode 8

后端 未结 10 1548
南方客
南方客 2020-12-08 10:28

I switched my project over to new beta versions of iOS 10 and XCode 8. In all three areas of my app where I use:

imageView.layer.cornerRadius = imageView.fra         


        
相关标签:
10条回答
  • 2020-12-08 10:38

    I had the same problem and calling layoutIfNeeded before all the rounded corner / clipsToBounds stuff fixed the issue. iOS 10 GM with xcode 8 GM causes views to disappear due to roundedCorners & clipsToBounds

    0 讨论(0)
  • 2020-12-08 10:44

    I had the same problem. Not showing on the phone, but perfect on Storyboard and UI debugger. It was also working when I was putting the project "Opens with Xcode 7" instead of 8 but wasn't a satisfying solution. So I digged and found out the problem. The trouble was with a class looking like this :

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

    I changed it to this and it works now :

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

    Note that none of the above worked for me, and I mean :

    • Calling layoutIfNeeded in the layoutSubviews()
    • Calling layoutIfNeeded in the awakeFromNib of my button (or my cell containing the button)
    • Calling layoutIfNeeded in the layoutSubview of my cell
    • Calling contentView.layoutIfNeeded() in the awakeFromNib of my cell
    • Calling view.layoutIfNeeded() in my view controller
    0 讨论(0)
  • 2020-12-08 10:47

    You should call layoutSubviews() on the main view before call imageView.frame.size.width

    [self.view layoutSubviews];
    imageView.layer.cornerRadius = imageView.frame.size.width/2
    imageView.clipsToBounds = true
    
    0 讨论(0)
  • 2020-12-08 10:48

    It might be a layout issue. Setting clipToBounds to false would show the image even if its size is zero. Can you print the frame of your images?

    If you set the cornerRadius and clipToBounds properties in viewDidLoad, try doing it in viewDidLayoutSubviews().

    You could also try to call self.view.layoutIfNeeded().

    0 讨论(0)
  • 2020-12-08 10:50

    I think the problem happens because we set the round corner and clip subviews as @Pranoy C said.

    I solved the problems by using layoutIfNeeded for the my tableview cell showing a user's profile picture. I want to ensure the image is round corner

    Code is as follow: - (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;}
    
    0 讨论(0)
  • 2020-12-08 10:54

    This sounds like it could be due to a new bug since iOS 10 and Xcode 8 where views are initialised at size 1000x1000 and when trying to set corner radius to half your frame, it is setting it to 500 instead. This is documented further in this question here: Since Xcode 8 and iOS10, views are not sized properly on viewDidLayoutSubviews. My reason for thinking this is the fix to the 1000x1000 issue it to call layout subviews before doing anything that requires sizes for something that has been constructed on the interface builder.

    0 讨论(0)
提交回复
热议问题