Центральная точка для UIView кажется неточной - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть пользовательский UIView, который я загружаю из xib с некоторым содержимым, таким как метки, изображения и другое представление.Я помещаю это представление внутри корневого представления UIViewController в раскадровке.Добавить ограничения и все такое.Выглядит великолепно.

Затем я создаю еще один пользовательский UIView, похожий на речевой пузырь, который будет вызываться из UIViewController с помощью функции класса.Из этой функции я хочу поместить точку речевого пузыря этого представления в центр основного представления.Поэтому я считаю, что нам нужна ссылка на центральную точку для базового представления в контексте представления контроллера представления с использованием метода convert(_:to:) UIView.Это должно вернуть координаты в центр основного вида, но со ссылкой на весь экран, а не на сам вид.

Результаты, которые я получаю при использовании CGRect версии этой функции, представляются точными.Тем не менее, когда я использую CGPoint, чтобы получить центральную точку этого обзора, кажется, что это далеко.Проверьте это:

Depicts the main view as well as the underlying viewsframed by colored borders, along with dots that represent the coordinates to the center of the underlying view

Вот код, который я использую:

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!
}

Я немного озадаченчто здесь происходит.Есть мысли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...