cornerRadius
に設定されたUIView
と、同じUIImageView
内のUIView
があります。 RockProfileView.frame.size.height / 2
でコーナー半径を計算していますが、UIViewはiOS 10で表示を停止しました。
さらにチェックした後、幅と高さの制約が64.0に設定されている間にRockProfileView.frame.size.height / 2
の値が1000.0になることがわかりました。
RockProfileView.layer.cornerRadius = 32
を64/2にハードコーディングすると、うまく動作します。
何が問題なのでしょうか?
完全なコード:
RockProfileView.layer.cornerRadius = RockProfileView.frame.size.height / 2
RockProfileView.clipsToBounds = true
RockProgressView.layer.masksToBounds = true
ロブが答えたように、コードをviewDidLoad
からviewDidAppear
に移動しました。問題は修正されました。
またはviewDidLoad
のコードの前にself.view.layoutIfNeeded()
を追加すると、問題も解決します。
UITableViewCellの場合、Inside awakeFromNib
add [self layoutIfNeeded];
コーナー半径を更新する前に、すべての問題を解決する必要があります。
awakeFromNib
でこのコードを実行しましたが、ios 10 + xcode 8にアップグレードした後、動作しなくなりました。
次に、このコードをlayoutSubViews
メソッドに移動しました。それはうまくいきました。
これがあなたの役に立つことを願っています。
まだawakefromnibでこれを行いたい場合は、(dispatch_afterまたはNSOperatinQueueまたはperformSelectorWithDelayを使用して)いくつかの遅延を置いてからこれを行います。
ViewControllers
のいずれかの中にある場合、すべてのレイヤー操作をviewDidLayer
に移動する代わりに、そのコードをDispatchQueue
の中に移動します。これは私のために働いた:
DispatchQueue.main.async {
let layer = self.signUpBtn.layer
layer.borderColor = UIColor.white.cgColor
layer.borderWidth = 2 / UIScreen.main.scale
}
これがあなたに役立つことを願っています
XCode8には、レイヤーのcornerRadiusを直接設定することはできません。
UIViewのcornerRadiusを適用する場合、cornerRadiusを適用する前に1行のコードを追加する必要があります。
yourButton.layoutIfNeeded()
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
私にとっては、最初にlayoutIfNeededを呼び出し、後にset cornerRadiusを呼び出すことでした
Swift(またはObjective-CではIBInspectable))で@IBInspectable
とマークされ、Interface Builderの属性インスペクターパネルで簡単に編集できます。
属性インスペクターでcornerRadiusを直接設定できます
extension UIView {
@IBInspectable var cornerRadius: CGFloat {
get{
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
layer.masksToBounds = newValue > 0
}
}
}
スイフト3
このコードを試して、UIImageviewのコーナー半径を定義します
imgProfile.layer.cornerRadius = imgProfile.frame.size.width / 2
imgProfile.clipsToBounds = true
Swift 3.2ソリューション
まだこの問題がある場合は、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()
}
}
}
同じ問題がありました。iOS10のみです。 ViewDidLayoutSubviewsまたはViewDidLoad(おそらく他のものでも、チェックしなかった)は、YPKが提案したようにディスパッチキューでレイアウトコードをラップした場合にのみ機能することがわかりました。
Xamarinを使用しているため、構文が少し異なります。
DispatchQueue.MainQueue.DispatchAsync(() =>
{
SetYourViewProperties();
});
動作させるには、メインスレッドで実行する必要がありました。
dispatch_async(dispatch_get_main_queue(), ^{
[imageView.layer setCornerRadius:4];
[imageView.layer setMasksToBounds:YES];
});
前の回答で述べたように、コーナー半径を変更する前にself.layoutIfNeeded()
を追加するとうまくいきました。