Собственно сам скрин
как видно по панели снизу, таких картинки 3 разных
вставляется обычный UIImageView, все метки я делал как UIButton
на сервере у нас хранится список координат всех меток, так же можно добавлять, удалять метки на сервере.
сам принцип получения координат для меток заключался в следующем, мы с дизайнером высчитывали по его оригинальному шаблону все координаты, исходя из размера метки, вычисляли соотношение метки к самой картинке. это соотношение нужно будет учитывать, что бы метки распологались всегда в одном и том же месте, на разных экранах.
в данном случае, я использую UICollectionView и все картинки находятся в своих ячейках
дефолтные значения размеров взяты из оригинального дизайна, что бы вычислить соотношение
var scale: CGFloat!
var viewCenter: CGPoint!
let defaultMapWidth: CGFloat = 216
let defaultMapHeight: CGFloat = 486
let defaultPointWidth: CGFloat = 31
let defaultPlaceholderWidth: CGFloat = 19
var pointSize: CGFloat!
var placeholderOffset: CGFloat!
func setUpView(for gender: SettingsLists.Gender, with viewType: PainPointView) {
mapImageView.image = UIImage.init(named: mapImage)!
layoutIfNeeded()
}
override func layoutSubviews() {
super.layoutSubviews()
if layoutIsReady {
updatePoints()
}
layoutIsReady = true
}
func updatePoints() {
mapImageView.subviews.forEach { $0.removeFromSuperview() }
setUpPoints()
}
private func setUpPoints() {
scale = mapImageView.bounds.height / defaultMapHeight
viewCenter = CGPoint(x: mapImageView.bounds.width / 2, y: mapImageView.bounds.height / 2)
pointSize = defaultPointWidth * scale
placeholderOffset = defaultPlaceholderWidth * scale / 4 + 0.7
pointsKindMap = []
for pointModel in pointDetails {
pointsKindMap.append(pointModel.painPoint.id)
}
allPoints.forEach {
if $0.viewType == viewType {
drawPoint(point: $0)
}
}
}
private func drawPoint(point: PainPoint) {
// это координаты из сервера
let pointX = CGFloat(gender == .male ? point.maleCoords.x : point.femaleCoords.x)
let pointY = CGFloat(gender == .male ? point.maleCoords.y : point.femaleCoords.y)
let pointPosition = CGPoint(x: viewCenter.x + pointX * scale - placeholderOffset, y: viewCenter.y + pointY * scale - placeholderOffset)
let pointView = PainInjuryPointView(frame: CGRect(origin: pointPosition, size: CGSize(width: pointSize, height: pointSize)))
mapImageView.addSubview(pointView)
}