web-dev-qa-db-ja.com

cornerRadiusはSwift 2.3 / iOS 10 / Xcode 8で動作を停止しました

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
30
Ankit Khanna

ロブが答えたように、コードをviewDidLoadからviewDidAppearに移動しました。問題は修正されました。

またはviewDidLoadのコードの前にself.view.layoutIfNeeded()を追加すると、問題も解決します。

UITableViewCellの場合、Inside awakeFromNib add [self layoutIfNeeded];コーナー半径を更新する前に、すべての問題を解決する必要があります。

32
Ankit Khanna

awakeFromNibでこのコードを実行しましたが、ios 10 + xcode 8にアップグレードした後、動作しなくなりました。

次に、このコードをlayoutSubViewsメソッドに移動しました。それはうまくいきました。

これがあなたの役に立つことを願っています。

まだawakefromnibでこれを行いたい場合は、(dispatch_afterまたはNSOperatinQueueまたはperformSelectorWithDelayを使用して)いくつかの遅延を置いてからこれを行います。

8
Mehul Thakkar

ViewControllersのいずれかの中にある場合、すべてのレイヤー操作をviewDidLayerに移動する代わりに、そのコードをDispatchQueueの中に移動します。これは私のために働いた:

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

これがあなたに役立つことを願っています

4
YPK

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
3
Sunil aruru

私にとっては、最初に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
    }
  }
}
1

スイフト3

このコードを試して、UIImageviewのコーナー半径を定義します

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

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()
        }
    }
}
0
Herman Coma

同じ問題がありました。iOS10のみです。 ViewDidLayoutSubviewsまたはViewDidLoad(おそらく他のものでも、チェックしなかった)は、YPKが提案したようにディスパッチキューでレイアウトコードをラップした場合にのみ機能することがわかりました。

Xamarinを使用しているため、構文が少し異なります。

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

動作させるには、メインスレッドで実行する必要がありました。

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

前の回答で述べたように、コーナー半径を変更する前にself.layoutIfNeeded()を追加するとうまくいきました。

0
A. Edwards