У меня есть пользовательский UIView
, который я загружаю из xib с некоторым содержимым, таким как метки, изображения и другое представление.Я помещаю это представление внутри корневого представления UIViewController
в раскадровке.Добавить ограничения и все такое.Выглядит великолепно.
Затем я создаю еще один пользовательский UIView
, похожий на речевой пузырь, который будет вызываться из UIViewController
с помощью функции класса.Из этой функции я хочу поместить точку речевого пузыря этого представления в центр основного представления.Поэтому я считаю, что нам нужна ссылка на центральную точку для базового представления в контексте представления контроллера представления с использованием метода convert(_:to:)
UIView.Это должно вернуть координаты в центр основного вида, но со ссылкой на весь экран, а не на сам вид.
Результаты, которые я получаю при использовании CGRect
версии этой функции, представляются точными.Тем не менее, когда я использую CGPoint
, чтобы получить центральную точку этого обзора, кажется, что это далеко.Проверьте это:
Вот код, который я использую:
class TipView: UIView {
class func present(overView targetView: UIView, _ vc: UIViewController, outlineColor: UIColor) {
//frame the underlying view
let viewFrame = targetView.convert(targetView.bounds, to: vc.view)
let frameView = UIView(frame: viewFrame)
frameView.backgroundColor = .clear
frameView.layer.borderColor = outlineColor.cgColor
frameView.layer.borderWidth = 5
vc.view.addSubview(frameView)
//place a dot at the center of the underlying view
let targetViewCenter = targetView.convert(targetView.center, to: vc.view)
targetView.dot(atPoint: targetViewCenter, color: outlineColor)
}
}
extension UIView {
func dot(atPoint point: CGPoint, size: CGSize = CGSize(width: 8, height: 8), color: UIColor = .black) {
let dotPath = UIBezierPath(ovalIn: CGRect(origin: CGPoint(x: center.x - size.width/2,
y: center.y - size.height/2),
size: size))
let layer = CAShapeLayer()
layer.path = dotPath.cgPath
layer.strokeColor = color.cgColor
self.layer.addSublayer(layer)
}
}
class ViewController: UIViewController {
@IBOutlet weak var HUDView: HUDView!
@IBAction func toggleTipView(_ sender: UIButton) {
let targetView = HUDView.graySquare!
TipView.present(overView: targetView, self, outlineColor: .green)
let targetView2 = HUDView.HPBar!
TipView.present(overView: targetView2, self, outlineColor: .blue)
}
}
class HUDView: UIView {
@IBOutlet weak var graySquare: UIView!
@IBOutlet weak var HPBar: UIView!
}
Я немного озадаченчто здесь происходит.Есть мысли?