I just updated my Xcode ver from 7.3 to 8.0 and some buttons borders disappeared.
The code looks fine, so I really don't know what happened to the layers. btw - in some other controllers I can see the layers borders.
self.button.layer.borderColor = borderColor.CGColor;
self.button.layer.borderWidth = 2;
self.button.layer.cornerRadius = CGRectGetHeight(self.button.frame) / 2;
before: (The image is only for example - the borders looks different at real time)
now:
To force view frame to be calculated, you can try with layoutIfNeeded. For example for a label in a UITableViewCell :
I think problem in it:
When you set corner i think height button don't have value or value to larger border will don't show. You can try change it to
If work, I think you can check your logic and set it when height button get right value.
Try this and check:
The reason is that XCode 8 introduces a new way to zoom in Storyboards.
Before XCode 8, in the view controller life cycle,
frames
were not known in viewDidLoad (or in propertiesdidSet
). You had to wait until viewDidLayoutSubviews (which is when Autolayout had finished applying the constraints to determine the frames of every subview in the main view. Butbounds
were accessible before that: they were just set to the size of the IBOutlet in the storyboard.In XCode 8, things are different : due to their new zooming system, even the
bounds
are not correct before ViewDidLayoutSubviews (they may exist but with dummy values like 1000 x 1000).In conclusion :
bounds
, then do so in viewDidLayoutSubviews, or use NSLayoutConstraints (their value is fixed and known from Autolayout)layoutSubviews
(but then you need to give either a fixed value or a NSLayoutConstraint constant to cornerRadius), or inawakeFromNib
(in that case, just addself.layoutIfNeeded
before doing anything frame- or boounds-related, in order to force the cell to recalculate its subviews' frame).the RoundedRect is deprecated use UIButtonTypeSystem instead. see https://developer.apple.com/reference/uikit/uibutton?language=objc for more information.
use dispatch_after