2016-09-12 7 views
1

UIView(基本的には円形の色付きの点)を、画面の左右にある制約に合わせて配置する方法を理解する必要があります。それとも制約のない方がいいですか?SwiftのNSLayoutConstraintを使ってビジュアルタイムライン上に複数のUIViewを配置

ラインは当日に基づくべきである(24時間)

Egが - 私が表す3 NSDatesをお持ちの場合は3回(午前7時、12時、および22時)私は彼らがなりたいですタイムライン上に正しく配置されている:

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

EDIT。 もう少し考えてみたら、これを達成できないことがわかりました。タイムライン上の各点は、特定のタスクのための「トゥード」時代です。しかし、いくつかのタスクがあります。各タスクはテーブルセルです。したがって、複数のタイムラインがあります:

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

そして、各ドットの上にラベルが付いているため、時間によってドットを配置することができません。垂直方向では、24箇所のスペースがないからです。そのため、(2つの異なるタイムラインで)同じ時間のドットは正しく整列されません。

私が今解決したのは、各タスクの時間を12.00より前のすべての時間と12.00より後のすべての時間の2つの配列に分割することです。

次に、最初の配列を左から(最も早い時点からスーパービューにつながる)最も早い時間から開始し、残りの部分をビューの前に置いてください。

次に、2番目の配列を取り、最後(最後の時刻)から開始し、右側に追加します(スーパービューに続く制約)。残りの部分は前にビューに残っています。

これが結果です: enter image description here

+0

ための上記の変更のいくつかのもの? –

+0

あなたの答えで私の質問を編集しました。 – alengqvist

答えて

0

私は似た何かをしました。私はNSDateに従って水平に配置された数字で各テーブルビューのセルビューのUIImageを返します。 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 
     } 
    } 
} 

24時間であれば水平にフィットするのが難しく、データでは最初の1時間から最新の1時間にしか移動しません。午前7時〜午後10時は合った。次に(制約の)左端からの距離を取得する

...

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

注24等しいサイズのUIView水平を取る約方法スウィフト3

+0

私はまだこれを試していないが、あなたが意味することを理解している。 しかし、すべてのビューに左端からの制約がある場合、時間のギャップが1時間または2時間しかないとすると、それらは互いにオーバーラップしませんか? たとえば、07:00、08:00、および09:00の3つのUIView。 私のドットビューは幅25-30の一定値をとるためです。 – alengqvist

+0

私は今あなたの解決策を成功させずに試みました。 新しいビューと前のビューの間の距離を計算することによって、各後続ビューをその前のオブジェクトの右側に配置することができました。 計算:(distanceToLeft_newView - distanceToLeft_predecessorView)。しかし、2つの時間(例えば、08.00と16.00)の間に多大な時間があった場合、3回目は画面外に配置されました。 私はここにくっついていると思う... – alengqvist

+0

重複している場合は、レイアウトを考え直さなければならないかもしれません。たぶん、時ラベルを上に1つ、上に1つ、下に1つ...など。また、すべてのラベルがドットの1時間に固有の場合、分の余分なゼロを気にするのはなぜですか? –

関連する問題