Создать круговое изображение Посмотреть 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
методы.