2015-06-05 56 views
1

我的屏幕布局中有一個UIImageView,它根據容器視圖尺寸動態調整大小。我想將其轉換爲圓形視圖,並使用以下代碼:嘗試在Swift中製作圓形UIView時出錯

let dSize: CGFloat = min(imageview.frame.height, imageview.frame.width) 
imageview.frame = CGRectMake(0, 0, dSize, dSize) 
imageview.clipsToBounds = true 
imageview.layer.cornerRadius = dSize/2.0 
imageview.layer.borderWidth = 1.0 
imageview.layer.borderColor = UIColor.whiteColor().CGColor 

問題是生成的視圖並非總是圓形的。爲了達到這個效果,我必須在iPhone 4上劃分dSize2.0,在iPhone 5/5s上劃分爲1.7,在iPhone 6/6s上劃分爲1.5。我無法弄清楚我做錯了什麼。

+0

你有沒有添加任何約束到'imageview'? – Bannings

+0

它在viewDidLoad func? –

+1

你的看法總是一個正方形?因爲如果寬度!=高度,那麼它不會是一個圓圈,它會更像一個圓角矩形 – Teo

回答

5

你可以試試這個

//To make your imageView circular 
imageView.layer.cornerRadius = imageView.frame.size.height/2; 
imageView.layer.masksToBounds = YES; 

//To add border 
imageView.layer.borderColor = [UIColor whiteColor].CGColor; 
imageView.layer.borderWidth = 2; 
+0

嗨。請檢查評論。將代碼放在viewDidLayoutSubviews中解決了這個問題,但我可以看到該視圖以圓形轉換。 – Claus

+0

我在viewDidLoad中這樣做,到目前爲止沒有問題。 –

+0

你可以用你的viewDidLayoutSubviews替換你的代碼片段嗎? –

0

viewDidLoad()是幾何太早您UIImageView相反,嘗試viewWillAppear()因爲這是我們保證幾何可用。

由於您使用的是自動佈局,我建議您將它粘貼到viewDidLayoutSubviews()。每次進行自動佈局時都會調用它。即使視圖不改變方向,這也可以是多次。當您在評論中指出,請確保調用super的方法中(你應該做的視圖控制器生命週期的方法,如viewDidLoad()等,以及相同)

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    self.addCircleBorderToImageView(self.imageView) 
} 

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    self.addCircleBorderToImageView(self.imageView) 
} 

// I made this UIView so it can be used with any view not just image views. 
func addCircleBorderToImageView(imgView: UIView) { 
    let dSize: CGFloat = min(imgView.frame.height, imgView.frame.width) 
    imgView.bounds = CGRectMake(0, 0, dSize, dSize) // centered in container you want to use bounds over frame for this scenario 
    imgView.clipsToBounds = true 
    imgView.layer.cornerRadius = dSize/2.0 
    imgView.layer.borderWidth = 1.0 
    imgView.layer.borderColor = UIColor.whiteColor().CGColor 
} 
+0

感謝您的完整答案。不幸的是結果是一樣的:我繼續把視圖看成方形的半秒鐘,然後變成一個圓圈。我也嘗試添加由@Jesper提出的CATransaction代碼,但沒有任何內容。 – Claus

+0

我正在加載一個方形圖像,uiimageview設置爲Aspect Fill,我已經設置了1:1的縱橫比。我注意到唯一的事情是,當到達addCircleBorderToImageView函數時視圖不是正方形。 LOG (lldb)po imgView.frame(0.0,0.0,240.0,128.0) – Claus

+0

您的約束是什麼?我有一個演示項目正在工作,用於處理左邊距的圖像視圖,請參閱頂部佈局指南,並將高度/寬度設置爲每個50。我建議添加一些自動佈局規則來保持寬度/高度相同 – Drmorgan