Как создать круговой UIImageView

#ios #swift #uiimageview

#iOS #swift #uiimageview

Вопрос:

У меня возникла проблема с созданием круга UIImageView . Если бы я вручную установил corderRadius значение, например. 50, у него был бы закругленный угол. Но когда я пытаюсь установить его равным половине высоты или ширины фрейма ( frame.width / 2 или frame.height / 2 ), это не работает. Каким-то образом, рамка появляется (0, 0, 0, 0) , когда я пытаюсь ее распечатать.

И вот мой код,

 import UIKit

class TestIconController : UIViewController {

let icon: UIImageView = {
    let imageView = UIImageView()
    imageView.layer.cornerRadius = imageView.frame.width / 2
    imageView.clipsToBounds = true
    imageView.layer.masksToBounds = true
    imageView.backgroundColor = .red
    imageView.translatesAutoresizingMaskIntoConstraints = false
    return imageView
}()

override func viewDidLoad() {
    super.viewDidLoad()
    loadLogo()
}

func loadLogo() {
    view.addSubview(icon)

    // Constraints
    icon.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    icon.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    icon.heightAnchor.constraint(equalToConstant: 200).isActive = true
    icon.widthAnchor.constraint(equalToConstant: 200).isActive = true
  }

}
  

Комментарии:

1. Это потому, что вы не устанавливаете прямоугольник (frame) в imageView .

2. Добавьте комментарий к @ElTomato .. Используйте Lazy var в подобных ситуациях.

Ответ №1:

Переопределите эту функцию.

 override func viewDidLayoutSubviews() {
        icon.layer.cornerRadius = icon.bounds.size.width / 2
        icon.clipsToBounds = true
        icon.layer.masksToBounds = true
    }
  

Комментарии:

1. Это сработало! Почему это icon.bounds вместо frame?

2. Вы также можете использовать фрейм вместо границ.

3. Я понимаю. Я действительно пытался это сделать, но почему-то это не сработало для моего реального проекта. Возможно, потребуется проверить это еще раз. В любом случае, спасибо! PS: Я думаю, потому что я использовал viewWillLayoutSubviews вместо viewDidLayoutSubviews

Ответ №2:

Вы также можете создать для него базовый класс для обработки теста; Например

 class UICirlceImageView : UIImageView {
    override open func layoutSubviews() {
        super.layoutSubviews();

        let layer:CALayer = self.layer;
        layer.cornerRadius = self.frame.size.width/2.0;
        layer.masksToBounds = true;
    }
}
  

затем сделайте это следующим образом

 //let icon: UICirlceImageView = { // You may initialize like this as well
let icon: UIImageView = {
    let imageView = UICirlceImageView()
    imageView.backgroundColor = .red
    //imageView.translatesAutoresizingMaskIntoConstraints = false // Don't know if it is needed
    return imageView
}()
  

Примечание: Ответ, данный Rushabh, также правильный.

Ответ №3:

Вы можете создать эти расширения

 extension UIImageView {

    func setRounded() {
        self.layer.cornerRadius = self.frame.width / 2
        self.layer.masksToBounds = true
        self.clipsToBounds = true
    }
}
  

В вашем случае вы можете внутри viewDidLayoutSubviews вызвать

 icon.setRounded()