Вы путаете кадр и границы вида.
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))