Закругленные углы в пользовательской UICollectionViewCell не работают в Swift

#ios #swift #cornerradius

#iOS #swift #cornerradius

Вопрос:

У меня есть пользовательская UICollectionViewCell и я пытаюсь закруглить углы для кнопки, которая не работает. У меня была такая же проблема для ViewController, и проблема заключалась в том, что я выполнял округление в viewDidLoad вместо subviewsDidLoad.

Я понятия не имел, в чем проблема сейчас.

делюсь своим кодом.

     override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        initialsButton.layer.cornerRadius = 0.5 * initialsButton.frame.size.width
        initialsButton.clipsToBounds = true
        initialsButton.layer.masksToBounds = true
    }
 

-> но я также пробовал без .clipsToBounds и .masksToBounds. Тот же результат.

Вот результат. Это не круг, это заставляет corner ошибочно
ВИДЕТЬ ЭТОТ РЕЗУЛЬТАТ

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

1. Для применения закругленных углов к любому виду вам просто нужно указать cornerRadius и сделать clipsToBounds = true . Вот и все.

2. @DharaPatel i.stack.imgur.com/3cb2x.png посмотрите на этот результат. Я сделал cornerRadius и clipsToBounds. Мой код здесь. В чем проблема, почему у меня есть результат?

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

4. Да, его соотношение равно 1: 1

Ответ №1:

Проблема заключалась в том, что я делал закругление углов в awakeFromNib(), вместо этого вы ДОЛЖНЫ сделать это в layoutSubviews(), и это работает хорошо.

Ответ №2:

Я полагаю, вы используете IBOutlet для создания класса примерно так, добавьте кнопку в свою ячейку в раскадровке, отредактируйте там, как хотите, это проще. Ваш код не очень хорош, просто удалите size, frame.height / 2 — это то, что вам нужно, если вы идете этим путем.

 @IBDesignable
class RoundedBtn: UIButton {

@IBInspectable var cornerRadius: Double {
    get {
        return Double(self.layer.cornerRadius)
    }set {
        self.layer.cornerRadius = CGFloat(newValue)
    }
}

@IBInspectable var borderWidth: Double {
    get {
        return Double(self.layer.borderWidth)
    }
    set {
        self.layer.borderWidth = CGFloat(newValue)
    }
}

@IBInspectable var borderColor: UIColor? {
    get {
        return UIColor(cgColor: self.layer.borderColor!)
    }
    set {
        self.layer.borderColor = newValue?.cgColor
    }
}

@IBInspectable var shadowColor: UIColor? {
    get {
        return UIColor(cgColor: self.layer.shadowColor!)
    }
    set {
        self.layer.shadowColor = newValue?.cgColor
    }
}

@IBInspectable var shadowOffSet: CGSize {
    get {
        return self.layer.shadowOffset
    }
    set {
        self.layer.shadowOffset = newValue
    }
}

@IBInspectable var shadowRadius: Double {
    get {
        return Double(self.layer.shadowRadius)
    }set {
        self.layer.shadowRadius = CGFloat(newValue)
    }
}

@IBInspectable var shadowOpacity: Float {
    get {
        return self.layer.shadowOpacity
    }
    set {
        self.layer.shadowOpacity = newValue
    }
}

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

override init(frame: CGRect) {
    super.init(frame: frame)
    commonInit()
}

func commonInit() {
    self.titleLabel?.numberOfLines = 0
    self.titleLabel?.textAlignment = .center
    self.setContentHuggingPriority(UILayoutPriority.defaultLow   1, for: .vertical)
    self.setContentHuggingPriority(UILayoutPriority.defaultLow   1, for: .horizontal)
}

override var intrinsicContentSize: CGSize {
    let size = self.titleLabel!.intrinsicContentSize
    return CGSize(width: size.width   contentEdgeInsets.left   contentEdgeInsets.right, height: size.height   contentEdgeInsets.top   contentEdgeInsets.bottom)
}

override func layoutSubviews() {
    super.layoutSubviews()
    titleLabel?.preferredMaxLayoutWidth = self.titleLabel!.frame.size.width
}
 

}

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

1. Спасибо, что поделились, но вся идея заключалась в том, что я хотел круглую кнопку, поэтому я должен использовать width / 2, и это невозможно сделать с помощью некоторых постоянных pxs. Но я создал класс RoundButton, и он не работает.