Используете SwiftUI или UIKit для позиционирования элементов просмотра? - PullRequest
1 голос
/ 28 мая 2020

Это более или менее репост вопроса, который, я думаю, можно было бы воспроизвести более минимально. Я пытаюсь сформировать текстовый пузырь, используя треугольник, созданный переопределенной функцией draw (), и остальной частью выноски. Я удалил весь код, который никак не мог повлиять на расположение треугольника или прямоугольника.

Резюме: я хотел бы переместить треугольник, созданный функцией рисования, за пределы кадра, созданного при инициализации (в настоящее время он находится внутри кадра).

Если я могу добавить что-нибудь к уточните или уточните этот вопрос, дайте мне знать.

class CustomCalloutView: UIView, MGLCalloutView {

    let dismissesAutomatically: Bool = false
    let isAnchoredToAnnotation: Bool = true
    let tipHeight: CGFloat = 10.0
    let tipWidth: CGFloat = 20.0
    lazy var leftAccessoryView = UIView()
    lazy var rightAccessoryView = UIView()

    weak var delegate: MGLCalloutViewDelegate?

    //MARK: Subviews -



    required init() {
        // init with 75% of width and 120px tall
        super.init(frame: CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 
        UIScreen.main.bounds.width * 0.75, height: 120)))

        setup()
    }

    override var center: CGPoint {
        set {
            var newCenter = newValue
            newCenter.y -= bounds.midY
            super.center = newCenter
        }
        get {
            return super.center
        }
    }

    func setup() {
        // setup this view's properties
        self.backgroundColor = UIColor.white
}


func presentCallout(from rect: CGRect, in view: UIView, constrainedTo constrainedRect: CGRect, 
animated: Bool) {
    //Always, Slightly above center
    self.center = view.center.applying(CGAffineTransform(translationX: 0, y: -self.frame.height))
    view.addSubview(self)

}


override func draw(_ rect: CGRect) {

    // Draw the pointed tip at the bottom.
    let fillColor: UIColor = .black

    let tipLeft = rect.origin.x + (rect.size.width / 2.0) - (tipWidth / 2.0)
    let tipBottom = CGPoint(x: rect.origin.x + (rect.size.width / 2.0), y: rect.origin.y + 
    rect.size.height)
    let heightWithoutTip = rect.size.height - tipHeight - 1

    let currentContext = UIGraphicsGetCurrentContext()!

    let tipPath = CGMutablePath()
    tipPath.move(to: CGPoint(x: tipLeft, y: heightWithoutTip))
    tipPath.addLine(to: CGPoint(x: tipBottom.x, y: tipBottom.y))
    tipPath.addLine(to: CGPoint(x: tipLeft + tipWidth, y: heightWithoutTip))
    tipPath.closeSubpath()

    fillColor.setFill()
    currentContext.addPath(tipPath)
    currentContext.fillPath()
}
}
...