Пользовательский UIVIEW не отображается? Неверно "переопределить init ()"? - PullRequest
0 голосов
/ 05 апреля 2020

Я пытаюсь создать какую-то подсказку. Но я думаю, что я сделал что-то не так в части инициализации. Почему моя подсказка не отображается в представлении? Не могу ли я использовать переопределить init, как это?

Как я могу инициализировать представление:

    let test = ToolTipView(frame: CGRect(x: self.view.center.x , y: self.view.center.y, width: self.view.frame.size.width, height: 50))
    self.view.addSubview(test)

Вот мой пользовательский класс UIView:

import UIKit

class ToolTipView: UIView {

    let tipOffset : CGFloat = 10.0

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

        print(frame)

        let mainRect = CGRect(x: frame.minX, y: frame.minY, width: frame.width, height: frame.height - tipOffset)
        let roundRectBez = UIBezierPath(roundedRect: mainRect, cornerRadius: 3.0)
        let mainShape = CAShapeLayer()
        mainShape.path = roundRectBez.cgPath
        mainShape.fillColor = darkGray.cgColor
        self.layer.addSublayer(mainShape)

        let trianglePath = createTip(_frame: frame)
        self.layer.insertSublayer(trianglePath, at: 0)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func createTip(_frame: CGRect) -> CAShapeLayer{
        let shape = CAShapeLayer()

        let tipRect = CGRect(x: _frame.minX, y: _frame.minY, width: _frame.width, height: _frame.height - tipOffset)

        let path = UIBezierPath()
        path.move(to: CGPoint(x: tipRect.midX - 10, y: tipRect.maxY))
        path.addLine(to: CGPoint(x: tipRect.midX, y: tipRect.maxY + tipOffset))
        path.addLine(to: CGPoint(x: tipRect.midX + 10, y: tipRect.maxY))
        path.addLine(to: CGPoint(x: tipRect.midX - 10, y: tipRect.maxY))
        path.close()

        shape.path = path.cgPath
        shape.fillColor = darkGray.cgColor

        return shape
    }
}

1 Ответ

0 голосов
/ 05 апреля 2020

Вы путаете кадр и границы вида.

frame вида - это его координаты в пределах его родительская система координат. bounds представления - это его координаты в его собственной системе координат.

Когда вы рисуете вещи со слоями и путями, все относительно системы координат представления, поэтому вы должны быть используя bounds, а не frame. Родитель представления довольно не имеет значения, когда вы рисуете.

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

    print(frame)

    // changed all "frame" to "bounds"
    let mainRect = CGRect(x: bounds.minX, y: bounds.minY, width: bounds.width, height: bounds.height - tipOffset)
    let roundRectBez = UIBezierPath(roundedRect: mainRect, cornerRadius: 3.0)
    let mainShape = CAShapeLayer()
    mainShape.path = roundRectBez.cgPath
    mainShape.fillColor = UIColor.darkGray.cgColor
    self.layer.addSublayer(mainShape)

    // here as well
    let trianglePath = createTip(_frame: bounds)
    self.layer.insertSublayer(trianglePath, at: 0)
}

Кроме того, при добавлении представления к его родительскому элементу вы, вероятно, подразумевали использование координаты x, равной 0, или половине ширины, иначе представление будет превышать границы своего родителя:

let test = ToolTipView(frame: CGRect(x: 0 , y: self.view.center.y, width: self.view.frame.size.width, height: 50))
// or
let test = ToolTipView(frame: CGRect(x: self.view.center.x , y: self.view.center.y, width: self.view.frame.size.width / 2, height: 50))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...