cornerRadius stopped working in Swift 2.3 / iOS 10

2019-01-14 01:46发布

问题:

I have a cornerRadius set on a UIView and a UIImageView inside the same UIView. I am calculating the corner radius with RockProfileView.frame.size.height / 2 but the UIView stopped showing in iOS 10.

After further checking i found the value of RockProfileView.frame.size.height / 2 is coming out to be 1000.0 while the width and height constraint is set to 64.0

When I hardcoded the RockProfileView.layer.cornerRadius = 32 to 64/2 it works just fine.

What could be the issue ?

Full code:

    RockProfileView.layer.cornerRadius = RockProfileView.frame.size.height / 2
    RockProfileView.clipsToBounds = true
    RockProgressView.layer.masksToBounds = true

回答1:

As answered by Rob, I've moved the code from viewDidLoad to viewDidAppear and the problem is fixed.

OR Adding self.view.layoutIfNeeded() before your code in viewDidLoad also solves the issue.

In case of UITableViewCell, Inside awakeFromNib add [self layoutIfNeeded]; before updating the corner radius should solve all the issues.



回答2:

I were done this code in awakeFromNib, but after upgrading to ios 10+xcode 8, it stopped working.

Then i moved this code to layoutSubViews method. Then it worked.

Hoping, this will be be useful to you.

If you want to still do this in awakefromnib, then do this after putting some delay(by using dispatch_after or NSOperatinQueue or performSelectorWithDelay)



回答3:

If it is inside your one of ViewControllers, instead of moving all layer operations to viewDidLayer, move that code inside DispatchQueue. This worked for me:

DispatchQueue.main.async {
            let layer = self.signUpBtn.layer
            layer.borderColor = UIColor.white.cgColor
            layer.borderWidth = 2 / UIScreen.main.scale
        }

Hope this helps for you



回答4:

New one thing into XCode8 we can't directly set the cornerRadius of the layer.

When you want to apply cornerRadius of UIView need to add one line of code before applying cornerRadius.

yourButton.layoutIfNeeded()

Example into Objective C.

[yourButton layoutIfNeeded];
yourButton.layer.cornerRadius = yourButton.frame.size.height/2;
[[yourButton layer] setBorderWidth:2.0f];
Example into Swift3

self.layoutIfNeeded()
yourButton.layer.cornerRadius = self.frame.height / 2.0
yourButton.layer.borderWidth = 2.0


回答5:

For me what it worked was first call layoutIfNeeded and later on set cornerRadius



回答6:

swift 3

I will try this code to define corner radius of UIImageview

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


回答7:

Marked with @IBInspectable in swift (or IBInspectable in Objective-C), they are easily editable in Interface Builder’s attributes inspector panel.
You can directly set cornerRadius in attributes inspector

extension UIView {

  @IBInspectable var cornerRadius: CGFloat {

   get{
        return layer.cornerRadius
    }
    set {
        layer.cornerRadius = newValue
        layer.masksToBounds = newValue > 0
    }
  }
}


回答8:

I had the same issue, iOS 10 only. I found that ViewDidLayoutSubviews or ViewDidLoad (possibly others too but I didn't check) only worked if I wrapped the layout code in the dispatch queue as YPK suggested.

I am using Xamarin so the syntax is a bit different:

DispatchQueue.MainQueue.DispatchAsync(() =>
        {
            SetYourViewProperties();
        });


回答9:

I had to run it on the main thread for it to work.

    dispatch_async(dispatch_get_main_queue(), ^{
       [imageView.layer setCornerRadius:4];
       [imageView.layer setMasksToBounds:YES];
});


回答10:

As mentioned in a previous answer, adding self.layoutIfNeeded() before changing the corner radius worked for me.



回答11:

Swift 3.2 Solution

In case anyone still having this problem, I solved the problem by rounding the cells (or any of its subviews) in viewDidLayoutSubviews.

override func viewDidLayoutSubviews() {
    if (tableView.visibleCells.count > 0) {
        for cell in tableView.visibleCells {
            let customCell = cell as! CustomCell
            // Use any rounding method you use
            customCell.exampleSubview.roundCorners(corners: .allCorners, radius: 6) 
            customCell.exampleSubview.layoutIfNeeded()
        }
    }
}


回答12:

In WWDC 2016 | What's New in Auto Layout, Apple recommend a way of autolayout named

Incrementally Adopting Autolayout

It means if the layout is easy, you can use autoresizing. And it will translate to constraints at run time.

So one of the solutions is use autoresizing, and you can get right frame about the view in anytime. But the premise is the autoresizing can satisfy your layout