2017-08-10 19 views
0

私はクラスから来たビューを持っていて、そのコーナーの半径をその半分の幅に設定したいと思います。ビューのロード後にコーナーの半径を設定する

幅は、autolayoutを使用して作成された計算されたプロパティです。だから、通常私はそう

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 

    c.largeProfileImage.layer.cornerRadius = c.largeProfileImage.frame.width/2 
} 

ようviewWillLayoutSubviews()コーナーradiusプロパティを設定すると思います。しかしlargeProfileImageは、のviewDidLoadと私はタップジェスチャーでそれをアニメーション化した後、それが呼び出される最初のビューではありません。以下は、ビューが画面上にアニメーション表示される場所です。この同じ機能で作成されます。

 //I tried setting the cornerRadius here as well but it isn't setting. 

    //c.largeProfileImage.layer.cornerRadius = c.largeProfileImage.frame.width/2 


    self.view.layoutIfNeeded() 

    UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: .curveEaseOut, animations: { 

     self.profileImageContainerCenterY?.constant = -(c.profileImageContainer.frame.height) * 2 
     self.profileSettingsContainerCenterY?.constant = 0 

     c.profileSettingsContainer.alpha = 1 
     c.largeProfileImage.alpha = 1 

     self.view.layoutIfNeeded() 
    }, completion: { (completed) in 
     self.view.layoutIfNeeded() 
}) 

EDIT:

ここprofileImage

let largeProfileImage: UIImageView = { 
    let pv = UIImageView() 
    pv.contentMode = .scaleAspectFill 
    pv.layer.masksToBounds = true 
    pv.clipsToBounds = true 
    pv.image = UIImage(named: "user") 

    pv.translatesAutoresizingMaskIntoConstraints = false 
    return pv 
}() 
+0

クラスビューからのビューの追加は、クラスが宣言されているコントローラと同じですか?またはコントローラAのクラスとコントローラAからクラスBのビューをコントローラBに追加しますか? –

+0

viewDidLayoutSubviewsメソッド内でcornerRadiusを追加しようとしましたか?このビューで試してください。すべてのビューが配置された後にcornerRadiusを設定すると役に立つかもしれません – 3stud1ant3

+0

'largeProfileImage.layer.masksToBounds = false'と' largeProfileImage .clipsToBounds = true' – Annjawn

答えて

1

問題を正常にデバッグできました。

幅はレイアウトが

c.largeProfileImage.layer.cornerRadius = c.largeProfileImage.frame.width/2 

self.view.layoutIfNeeded() 

を意味レイアウトされた前に0であっ計算性であったので、ゼロのコーナ半径をもたらしました。

そうソリューション...

は、幅が幅を計算した後、コーナー半径を設定した後からそれを呼び出すことでした。

self.view.layoutIfNeeded() 

c.largeProfileImage.layer.cornerRadius = c.largeProfileImage.frame.width/2 
0

適切なアニメーションのために、このような順序を変更します。

self.profileImageContainerCenterY?.constant = -(c.profileImageContainer.frame.height) * 2 
    self.profileSettingsContainerCenterY?.constant = 0 
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: .curveEaseOut, animations: { 
    c.profileSettingsContainer.alpha = 1 
    c.largeProfileImage.alpha = 1 
    self.view.layoutIfNeeded() 
}, completion: nil) 
+0

アニメーションはアニメーション化されても問題ありません。角の半径が設定されていません。 – Stefan

+0

コーナーの半径を設定すると、c.largeProfileImage.clipsToBounds = trueが追加されます。 –

+0

なぜ完了ハンドラで必要なlayoutIfを呼び出すのですか?必須ではありません。 –

0

次の3本のラインがラウンドイメージ -

image.layer.cornerRadius = image.frame.width/2 
image.layer.masksToBounds = false 
image.clipsToBounds = true 

を取得する必要があるあなたは、丸みを帯びたUIImageが表示されることがありますが、あなたはまた、画像が円の内側に乗、あなたがかもしれないことを解決するために気づくかもしれcontentModeで遊んでください。ほとんどの場合.scaleAspectFillが仕事をしています。

+0

ビューを作成するときに自己にアクセスできません...ビューを編集に含めます。 – Stefan

+0

あなたのアップデートでは 'masksToBounds = false'にする必要があります – Annjawn

+0

私はそれがクラスからビューを取得しており、ビューを正しく参照していないという事実と関係していると思います。または、幅が計算されたプロパティであり、幅が0に等しいときに角の半径が設定されているという事実。関数内でviewWillLayoutSubviewsを呼び出すことはできません。 – Stefan

関連する問題