2016-09-12 5 views
1

Мне нужно выяснить, как позиционировать 3 - 5 UIViews (в основном круглая нарисованная цветная точка) на горизонтальной линии, которые могут быть связаны из стороны в сторону на экране с ограничениями. Или лучше идти без ограничений?Позиционируйте несколько UIViews на визуальной временной шкале с NSLayoutConstraint в Swift

Линия должна быть основана на день (24 часа)

Eg - Если у меня есть 3 NSDates что составляет три раза (7:00, 12:00 и 22:00) Я хочу им быть правильно позиционируется на временной шкале:

| ------ 7 ---- 12 -------- 22- |

EDIT. С небольшим количеством размышлений я теперь вижу, что не смогу этого добиться. Дело в том, что каждая точка на временной шкале, скажем, «todo» -time для конкретной задачи. Но может быть несколько задач. И каждая задача представляет собой ячейку таблицы. Таким образом, будет несколько временных графиков:

| ------ 7 ---- 12 -------- 22- |
| ---- 5 ------ 12 ------ 20 --- |
| -------- 10-12 ------- 21-- |
| ------ 7 ---- 12 ----- 18 ---- |

И поскольку каждая точка имеет надпись над ней, я не смогу позиционировать точки в зависимости от времени. Поскольку в вертикальной ориентации нет места для 24 позиций. И поэтому точки с одинаковым временем (в двух разных временных рамах) не будут правильно выровнены.

Как я решил это сейчас, разбивая каждое время задач на два массива, один со всеми моментами до 12.00 и еще один со всеми моментами после 12.00.

Затем я беру первый массив, начиная с самого раннего времени слева (ограничение, ведущее на супервизор), а остальное право на просмотр до и так далее.

Затем я беру второй массив и начинаю с конца (последнее время) и добавляю его вправо (ограничение, ведущее к наблюдению), а остальное - до представления до и так далее.

Это результат: enter image description here

+0

Как насчет того, 24 равного размера UIView Horizontally ? –

+0

Я отредактировал свой вопрос с вашего ответа. – alengqvist

ответ

0

я сделал что-то подобное. Я возвращаю UIImage для каждого вида ячейки таблицы с номерами, расположенными горизонтально в соответствии с NSDate. Вам просто нужно превратить NSDate в значение CGFloat. Это расширение дает мне десятичное значение, представляющее час и минуту из NSDate.

extension NSDate { 
    var hourInDecimal: CGFloat { 
     get { 
      let userCalendar = NSCalendar.currentCalendar() 

      let timeNowInDecimal = CGFloat(userCalendar.component(.Hour, fromDate: self)) + CGFloat(userCalendar.component(.Minute, fromDate: self))/60 
      return timeNowInDecimal 
     } 
    } 
} 

Fitting их горизонтально был жестким, если это было 24 часов, так что я только идти с первого часа до последнего часа с данными. 7 утра -> 10 вечера.

Затем, чтобы получить расстояние от левого края (для ограничения) ...

let oneHourWidth = containerView.width/(lateHour - earlyHour) 
let distanceToLeftEdge = oneHourWidth * (eventTime.hourInDecimal - earlyHour) 

Обратите внимание, что некоторые из вышеуказанных изменений для Swift 3.

+0

Я еще не пробовал, но понимаю, что вы имеете в виду. Но если все виды имеют ограничение от левого края, они не будут перекрывать друг друга, если часовой промежуток позволяет говорить только 1 или 2 часа? Например, три UIViews с часами 07.00, 08.00 и 09.00. Поскольку мои точки-точки занимают постоянное значение 25-30 по ширине. – alengqvist

+0

Я пробовал ваше решение сейчас без успеха. Мне удалось отобразить каждый преемник справа от своего предшественника, вычислив расстояние между новым и предыдущим представлениями. Расчет: (distanceToLeft_newView - distanceToLeft_predecessorView). Но если между двумя временами было большое количество часов (например, с 08.00 до 16.00), третий раз был помещен вне экрана. Я думаю, что я застрял здесь ... – alengqvist

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^