Как реализовать отметки на план схеме ?


#1

Приветствую
Нужна Ваша помощ.

  1. Есть план схема jpg/png

  2. Каким способом порекомендуете делать отметку поверх столов / мест каким то цветом

  3. Также какой есть вариант реализации, что бы одно приложение админское ставило отметки, а на втором клиентском отображались данные отметки


#2
  1. Что конкретно вас интересеут?
  2. Я бы предложил в качестве админской панели вэб часть, т.к. на телефоне будет сложно попадать пальцем в столы / места. Реализацию уведомлений можно сделать через Firebase. В любом случае админка выйдет сложнее, чем клиентская часть, если только на клиентской части не будет возможности тоже выбирать столы / места.

#3

Ввиду отсутствия конкретных ответов выскажу свои мысли:

Задумка интересно, но как ее грамотно реализовать вторым, прозрачным слоем поверх картинки – хз.
Можно, конечно, костылями привязать кнопки строго к определенным координатам, но муторно. С другой стороны места не так часто меняются.

Для точного попадания по конкретному месту без приближения не обойтись.

Если же смотреть на других, то в качестве примера можно взять бронь мест в кинотеатре. Там разрабы не сильно заморачивались и просто наштамповали квадратиков.


#4

Пока видно только один более-менее подходящий вариант: послойное разделение.
Вам в любом случае придётся делать:

  1. фон, который не меняется
  2. поверх фона интерактивные элементы - ваши столики
  3. в админке это кнопки с имеджем; в клиентке это просто имеджы, меняющие цвет

Берёте фон и вырезаете и сохраняете каждый столик в отдельную картинку. На фон накладываете кнопки с каждым отдельным изображением столика. Меняете им цвет в зависимости от условий.
Схема большая - придётся делать скролл в двух осях, чтобы сохранить адекватный масштаб картинки для удобного взаимодействия.


#5

Приветсвую. Спасибо как всегда за Ваши ответы.

  1. Если взять данну план схему. И свверху наложить слои imageview которые будут менять цвет. Это оптимальное решение? Не слишком много будет imageView как для одного view. Поскольку тут около 120 столов.
  2. А что Вы подруузомеваете под веб часть? Не совсем понял

#6

Приветсвую. Спасибо за ответ
Если взять данну план схему. И свверху наложить слои imageview которые будут менять цвет. Это оптимальное решение? Не слишком много будет imageView как для одного view. Поскольку тут около 120 столов.


#7

Благодарю за развернутый ответ

  1. Это основной слой план схемы. понял
  2. каждый столик отдельный imageview или одинаковые как то можно переиспользовать?
  3. через firebase лучше всего?

Да про скрол не подумал. Спасибо за ответ


#8

это относится и к вашему количеству: тут не лучшего решения, есть и минусы и плюсы:

  1. Делайть всё кодом. Добавьте к imageview через extention инициализатор, который примет нужные вам параметры, и установит, всё что надо. Все ваши столики прогнать через цикл по вашему массиву данных - вот вам 120 нужных объектов.

Плюсы: делать всё кодом всегда лучше, меньше нагрузка на комп при компиляции и просто управлять объектами потом. Бест-практис )))
Минусы: Придется расставлять констрейнты вручную, что в итоге даст тонны кода.

  1. Через сториборд. Тут всё понятно.

Плюсы: расставить на общем плане будет проще и быстрее.
Минусы: создавать долго много объектов. Управлять трудно и неудобно, легко запутаться.

Я всегда за код. Это всегда лучше и дальновиднее, да и узнаете много нового про констрейты, если ещё с ними через код не работали.

Смотря какая задача?

  1. кроссплатформенность подразумевается? Если да, то однозначно файербейз.
  2. Если только iOS, то я бы взял нативный CloudKit: никакой регистрации не надо от пользователя требовать; свой эппловский продукт скорее будет надёжнее (если вдруг и сломается, то починят влёт), наверное. Сделаете публичный контейнер и всё ок.

#9

Благодарю за ответ. Я не использую сторибоард. Все только код))) С таким решением привет констрейны )))) Благодарю и пошел пробывать


#10

У меня был опыт расположения меток на картинке, только там масштабы были меньше, в пределах 20-25 меток.
Как будет время, найду скрин и расскажу как делал.


#11

Собственно сам скрин

как видно по панели снизу, таких картинки 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)
}

#12

Класс. Очень благодарен что посмотрели у себя, и показали пример., тогда я пробую. И уже по результату покажу что получилось. Все спасибо за время и то что помогли хорошими советами. Это лучшее что может быть при решении вопроса.