Круговые виды с Autolayout (снапкит)?

Я пытаюсь создать круговой вид, который имеет адаптивный размер на основе автоматического макета, в настоящее время я устанавливаю ограничения, затем я пытаюсь округлить изображение в методе viewwilllayoutsubviews.

Это приводит к появлению видов странной формы, которые не являются круглыми, как я могу решить эту проблему?

в этом:

    profilePic = UIImageView(frame: CGRect.zero)
    profilePic.clipsToBounds = true
    profilePic.contentMode = .scaleAspectFill

сдерживает:

 profilePic.snp.makeConstraints { (make) -> Void in
                make.centerX.equalTo(self).multipliedBy(0.80)
                make.centerY.equalTo(self).multipliedBy(0.40)
                make.size.equalTo(self).multipliedBy(0.22)
            }

subviews:

override func viewWillLayoutSubviews() {
        self.navigationMenuView.profilePic.layer.cornerRadius = self.navigationMenuView.profilePic.frame.size.width / 2.0
        self.navigationMenuView.profilePic.layer.borderWidth = 2
        self.navigationMenuView.profilePic.layer.borderColor = UIColor.white.cgColor
    }

результат:

введите здесь описание изображения


person jackdm    schedule 06.11.2017    source источник
comment
Попробуйте добавить еще одно ограничение соотношения сторон 1: 1 в imageView. Потому что, если вам нужен круг, должен быть квадратный imageView.   -  person Dipak Kacha    schedule 06.11.2017


Ответы (3)


Думаю, вам это нужно (извините за простой автопрокладку, но я не использую snapkit):

profilePic.heightAnchor.constraint(equalTo: profilePic.widthAnchor).isActive = true
profilePic.widthAnchor.constraint(equalTo: self.view.widthAnchor, multiplier: 0.22).isActive = true

Вместо этого:

make.size.equalTo(self).multipliedBy(0.22)
person Milan Nosáľ    schedule 06.11.2017

У меня такая же проблема

Это мое решение:

let profilePicHeight: CGFloat = 30.0

Добавьте эту строку кода в свои ограничения:

profilePic.snp.makeConstraints { (make) -> Void in
            make.height.width.equalTo(self.profilePicHeight)
            ...
        }

тогда:

override func viewWillLayoutSubviews() {
    self.navigationMenuView.profilePic.layer.cornerRadius = self.profilePicHeight / 2.0
    ...
}
person Alirza Eram    schedule 05.01.2021

Мое предложение здесь - не относиться к нему как к круговому обзору снаружи. Сделайте так, чтобы представление соответствовало кругу, чтобы его можно было использовать где угодно.

ВНУТРИ представления задайте ему ограничения вроде ...

widthAnchor.constraint(equalTo: heightAnchor).isActive = true

Это сделает его квадратным (неопределенного размера).

Затем в функции _2 _...

override func layoutSubviews() {
    super.layoutSubviews()

    layer.cornerRadius = bounds.size.width * 0.5
}

Это превратит квадрат в круг.

person Fogmeister    schedule 06.11.2017
comment
это в значительной степени то, что уже делает код? Я делаю квадрат в ограничениях, а затем округляю в подпредставлениях - person jackdm; 06.11.2017
comment
@jackdm, но вы по-прежнему говорите, что он будет квадратным в контроллере представления. Имеет смысл сделать сам вид квадратом. Кроме того, я сомневаюсь в использовании комплекта для защелкивания. Auto Layout действительно не сложно сделать. Я бы рекомендовал отказаться от этого и просто изучить Auto Layout. - person Fogmeister; 06.11.2017