Создать круговое изображение Посмотреть IOS проблема

Я хочу создать изображение круга для аватара моего профиля. Я попробовал это:-

   class CircleImageView: UIImageView {

    override func draw(_ rect: CGRect) {
        // Drawing code

        layer.masksToBounds = true
        layer.cornerRadius = min(rect.width/2 , rect.height/2)
        clipsToBounds = true


    }
}

Но это не работает.

3 ответа

extension Будет здорово установить угол или сделать круглое изображение:

extension UIImageView {
    func setRadius(radius: CGFloat? = nil) {
        self.layer.cornerRadius = radius ?? self.frame.width / 2;
        self.layer.masksToBounds = true;
    }
}

Использование:

imgview.setRadius(radius: 10)
imgview.setRadius() //default frame.width/2

Функция Draw предназначена для рисования неизменяемого слоя.

Используйте layoutSubviews

override func layoutSubviews() {
    super.layoutSubviews()

        layer.masksToBounds = true
        layer.cornerRadius = min(self.frame.width/2 , self.frame.height/2)
        clipsToBounds = true

}

Вы добавляете код в неправильном месте, drawRect: на самом деле не является правильным методом для создания такой функциональности для редактирования слоя, вы можете добиться этого следующим образом:

Редактирование слоя при init(frame:) и imageView (также добавление той же функциональности в init(coder:), потому что он должен работать для обоих подходов: программно и через раскадровку):

class CircleImageView: UIImageView {
    override init(frame: CGRect) {
        super.init(frame: frame)

        setupCircleLayer()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        setupCircleLayer()
    }

    private func setupCircleLayer() {
        layer.masksToBounds = true
        layer.cornerRadius = min(frame.width/2 , frame.height/2)
        clipsToBounds = true
    }
}

Или, как предложил @Mohammadalijf в своем ответе, переопределив метод layoutSubviews():

class CircleImageView: UIImageView {
    override func layoutSubviews() {
        super.layoutSubviews()

        layer.masksToBounds = true
        layer.cornerRadius = min(frame.width/2 , frame.height/2)
        clipsToBounds = true
        backgroundColor = UIColor.black
    }
}

Он выполняет желаемую функциональность, о которой вы просите, но учтите, что:

Подклассы могут переопределять этот метод по мере необходимости, чтобы выполнить более точную компоновку своих подпредставлений. Вы должны переопределить этот метод только в том случае, если авторазмер и основанные на ограничениях поведения подпредставлений не предлагают нужного вам поведения. Вы можете использовать свою реализацию для прямой установки прямоугольников фреймов ваших подпредставлений.

т. е. это связано с обновлением макета представления, для получения дополнительной информации обратитесь к документации; Вот почему я предпочитаю делать это в init методы.

Другие вопросы по тегам