Неправильное положение кривой нижнего правого угла (быстрая)

Кривая, которую я создал, не такая, как я предполагал:

  • это то, к чему я стремлюсь

    Неправильное положение кривой нижнего правого угла (быстрая)

  • это то, чего я достиг до сих пор:

    Неправильное положение кривой нижнего правого угла (быстрая)

class ConerViewBootomRight: UIView {
    
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        setup()
    }
    
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
        
    }
    //This method does the necessary UI adjustments
    func setup()
    {
        if #available(iOS 13.0, *) {
            
            let cornerRadius: CGFloat = 80.0 // Set the corner radius
            let path = UIBezierPath()
            path.move(to: CGPoint(x: 0, y: 0))
            path.addLine(to: CGPoint(x: self.bounds.width, y: 0))
            path.addLine(to: CGPoint(x: self.bounds.width, y: self.bounds.height - cornerRadius))
            path.addQuadCurve(to: CGPoint(x: self.bounds.width - cornerRadius, y: self.bounds.height), controlPoint: CGPoint(x: self.bounds.width, y: self.bounds.height))
            path.addLine(to: CGPoint(x: 0, y: self.bounds.height))
            path.close()

            let maskLayer = CAShapeLayer()
            maskLayer.path = path.cgPath
            self.layer.mask = maskLayer

         }
    }
}

Пожалуйста, помогите мне, я новичок в Swift.


1
75
1

Ответ:

Решено

Вы вызываете setup в инициализаторах. Это означает, что все обращения к self.bounds.width и self.bounds.height будут оцениваться в любых размерах, которые изначально имеет bounds представления. Если границы представления изменятся позже (например, будут установлены ограничениями AutoLayout), созданный вами путь по-прежнему будет использовать старую ширину и высоту.

Вам следует создать путь в layoutSubviews, чтобы каждый раз при размещении представления создавался новый путь (что потенциально может дать ему другой bounds).

class ConerViewBootomRight: UIView {
    
    var maskLayer: CAShapeLayer!
    
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        setup()
    }
    
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
        
    }
    
    func setup()
    {
        maskLayer = CAShapeLayer()
        self.layer.mask = maskLayer
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        let cornerRadius: CGFloat = 80.0
        let path = UIBezierPath()
        path.move(to: CGPoint(x: 0, y: 0))
        path.addLine(to: CGPoint(x: self.bounds.width, y: 0))
        path.addLine(to: CGPoint(x: self.bounds.width, y: self.bounds.height - cornerRadius))
        path.addQuadCurve(to: CGPoint(x: self.bounds.width - cornerRadius, y: self.bounds.height), controlPoint: CGPoint(x: self.bounds.width, y: self.bounds.height))
        path.addLine(to: CGPoint(x: 0, y: self.bounds.height))
        path.close()
        maskLayer.path = path.cgPath
    }
}

Интересные вопросы для изучения

Реагировать на собственный файл blob из данных API, мне нужно сохранить его в zip-файл, как это сделать в iosКак запросить разрешение на прозрачность отслеживания перед разрешением уведомления во флаттер iOSЯ столкнулся с ошибкой при выполнении запроса POST API: «Ошибка анализа JSON»TextField не меняет цвет переднего плана в iOS 17.4Проблемы с добавлением плагина OpenAPIGenerator для запуска плагинов инструмента сборки в Xcode с помощью SPMВыравнивание пользовательского интерфейса выглядит не очень хорошо, отображаются точки, как это исправить?Класс SwiftData @Model, порядок переключения операторов в блоке инициализации неожиданно нарушит представлениеЯ столкнулся с ошибкой при выполнении запроса POST API: «Ошибка анализа JSON»Swift-Combine, соединяйте все AnyPublisher в один и получайте данныеПроблемы с добавлением плагина OpenAPIGenerator для запуска плагинов инструмента сборки в Xcode с помощью SPM