Swift - после добавления пользовательского расширения Curve оно не отображает программно созданные представления, а только представления, созданные с помощью Interface Builder - PullRequest
0 голосов
/ 18 апреля 2019

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

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

Я создал простой пример для иллюстрации проблемы. Основная раскадровка содержит два viewController с одним цветным представлением посередине: один создан с помощью Interface Builder, а другой - программно.

В StoryboardVC вид с кривой отображается правильно без каких-либо проблем. Метод setBottomCurve () используется для создания кривой.

Если вы сравните это с установкой точки входа в ProgrammaticVC, при запуске приложения вы увидите простой белый экран. Прокомментируйте эту строку, чтобы вид снова появился.

Это расширение используется:

extension UIView {
    func setBottomCurve(curve: CGFloat = 40.0){

        self.frame = self.bounds

        let rect = self.bounds
        let y:CGFloat = rect.size.height - curve
        let curveTo:CGFloat = rect.size.height

        let myBezier = UIBezierPath()
        myBezier.move(to: CGPoint(x: 0, y: y))
        myBezier.addQuadCurve(to: CGPoint(x: rect.width, y: y), controlPoint: CGPoint(x: rect.width / 2, y: curveTo))
        myBezier.addLine(to: CGPoint(x: rect.width, y: 0))
        myBezier.addLine(to: CGPoint(x: 0, y: 0))
        myBezier.close()

        let maskForPath = CAShapeLayer()
        maskForPath.path = myBezier.cgPath
        layer.mask = maskForPath      
    }
    }

Я ожидаю, что ProgrammaticVC будет выглядеть идентично StoryboardVC (за исключением разницы в цвете)

Пример проекта можно найти здесь: https://github.com/belamatedotdotipa/CurveTest2

1 Ответ

0 голосов
/ 18 апреля 2019

Я предлагаю создать подкласс вместо использования расширения, это специфическое поведение.

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

class BottomCurveView: UIView {

    @IBInspectable var curve: CGFloat = 40.0 {
        didSet {
            setNeedsLayout()
        }
    }

    override func draw(_ rect: CGRect) {
        setBottomCurve()
    }

    private func setBottomCurve() {
        let rect = bounds
        let y: CGFloat = rect.size.height - curve
        let curveTo: CGFloat = rect.size.height

        let myBezier = UIBezierPath()
        myBezier.move(to: CGPoint(x: 0, y: y))
        myBezier.addQuadCurve(to: CGPoint(x: rect.width, y: y), controlPoint: CGPoint(x: rect.width / 2, y: curveTo))
        myBezier.addLine(to: CGPoint(x: rect.width, y: 0))
        myBezier.addLine(to: CGPoint(x: 0, y: 0))
        myBezier.close()

        let maskForPath = CAShapeLayer()
        maskForPath.path = myBezier.cgPath
        layer.mask = maskForPath
    }
}
...