| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- //
- // MapAmapMarkerNameContentView.swift
- // map_amap_ios
- //
- // Created by 诺诺诺的言 on 2025/7/22.
- //
- import Foundation
- class MapAnnotationMarkerTextView: UIView {
- // 常量定义
- private static let bubbleHeight: CGFloat = 24
- private static let triangleHeight: CGFloat = 6
- private static let minWidth: CGFloat = 60
-
- static var height: CGFloat {
- return bubbleHeight + triangleHeight
- }
- let text: String
- private var labelView: UILabel!
- private var backgroundView: UIView!
- private var triangleLayer: CAShapeLayer!
- init(text: String) {
- self.text = text
- super.init(frame: .zero)
- setupViews()
- }
- required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
-
- private func setupViews() {
- createSubviews()
- setupConstraints()
- }
-
- private func createSubviews() {
- // 创建胶囊形状背景视图
- backgroundView = UIView()
- backgroundView.backgroundColor = .white
- backgroundView.layer.cornerRadius = 12 // 较大的圆角,实现胶囊形状
- backgroundView.layer.masksToBounds = false
- backgroundView.layer.shadowColor = UIColor.black.cgColor
- backgroundView.layer.shadowOpacity = 0.2
- backgroundView.layer.shadowOffset = CGSize(width: 0, height: 1)
- backgroundView.layer.shadowRadius = 2
- addSubview(backgroundView)
-
- // 创建标签视图(单行文本)
- labelView = UILabel()
- labelView.text = text
- labelView.font = UIFont.systemFont(ofSize: 12, weight: .regular)
- labelView.textColor = .black
- labelView.backgroundColor = .clear
- labelView.textAlignment = .center
- labelView.lineBreakMode = .byTruncatingTail
- labelView.numberOfLines = 1 // 限制为单行
- backgroundView.addSubview(labelView)
-
- // 创建气泡三角形
- triangleLayer = CAShapeLayer()
- triangleLayer.fillColor = UIColor.white.cgColor
-
- let trianglePath = UIBezierPath()
- trianglePath.move(to: CGPoint(x: 0, y: 0)) // 左点
- trianglePath.addLine(to: CGPoint(x: 5, y: 6)) // 底点
- trianglePath.addLine(to: CGPoint(x: 10, y: 0)) // 右点
- trianglePath.close()
-
- triangleLayer.path = trianglePath.cgPath
- layer.addSublayer(triangleLayer)
- }
-
- private func setupConstraints() {
- // 启用AutoLayout
- translatesAutoresizingMaskIntoConstraints = false
- backgroundView.translatesAutoresizingMaskIntoConstraints = false
- labelView.translatesAutoresizingMaskIntoConstraints = false
-
- // 背景视图约束
- NSLayoutConstraint.activate([
- backgroundView.topAnchor.constraint(equalTo: topAnchor),
- backgroundView.leadingAnchor.constraint(equalTo: leadingAnchor),
- backgroundView.trailingAnchor.constraint(equalTo: trailingAnchor),
- backgroundView.heightAnchor.constraint(equalToConstant: Self.bubbleHeight)
- ])
-
- // 标签约束
- NSLayoutConstraint.activate([
- labelView.topAnchor.constraint(equalTo: backgroundView.topAnchor),
- labelView.leadingAnchor.constraint(equalTo: backgroundView.leadingAnchor, constant: 8),
- labelView.trailingAnchor.constraint(equalTo: backgroundView.trailingAnchor, constant: -8),
- labelView.bottomAnchor.constraint(equalTo: backgroundView.bottomAnchor)
- ])
-
- // 设置整个视图的高度(包含三角形)和最小宽度
- NSLayoutConstraint.activate([
- heightAnchor.constraint(equalToConstant: Self.height),
- widthAnchor.constraint(greaterThanOrEqualToConstant: Self.minWidth)
- ])
-
- layoutIfNeeded()
- updateTrianglePosition()
- }
-
- override func layoutSubviews() {
- super.layoutSubviews()
- updateTrianglePosition()
- }
-
- private func updateTrianglePosition() {
- // 更新三角形位置到底部中心
- let width = bounds.width
- triangleLayer.frame = CGRect(x: (width - 10) / 2, y: Self.bubbleHeight, width: 10, height: Self.triangleHeight)
- }
- }
|