2015-06-05 6 views
1

У меня есть UIImageView в моем макете экрана, который динамически изменяется в зависимости от размеров контейнера. Я хотел бы превратить его в круговом зрении, и я использую следующий код:Ошибка при попытке сделать круговой UIView в Swift

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 

Проблема заключается в том, что в результате точка зрения не всегда круговое. Для достижения эффекта мне нужно разделить dSize на 2.0 на iPhone 4, на 1.7 на iPhone 5/5s и на 1.5 на iPhone 6/6s. Я не могу понять, что я делаю неправильно.

+0

Вы добавляете какие-либо ограничения в 'imageview'? – Bannings

+0

это в viewDidLoad func? –

+1

Является ли ваше мнение квадратом? Потому что если width! = Height, то это не будет круг, он будет больше похож на закругленный прямоугольник – 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

Можете ли вы заменить свой фрагмент кода моим в вашем представленииDidLayoutSubviews? –

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

Спасибо за ваш полный ответ. Результат такой же, к сожалению: я продолжаю видеть вид как квадрат на полсекунды, тогда он становится кругом. Я также попытался добавить код CATransaction, предложенный @Jesper, но ничего. – 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

Смежные вопросы