iOSのアプリで一連の操作をしたのちに結果（レポート）を表示したいと思います。結果のフォーマットはありふれたもので、概略は

\---------------------（以下概略）

基本情報  
ユーザ名：〜  
日時：〜  
総合スコア：90点

グラフ  
ここにグラフを表示する

詳細結果  
ここに表（UICollectionView）を表示する

\---------------------（以上概略）

のようなものです。各々の内容は固定ではなくプログラムが生成します。

検討したものは以下の通りです。

  1. WebView  
以前のバージョンで使用しました。ベースのHTMLを作成して、動的に変更したい箇所の文字列を置換してUIWebViewに与えるというものです。正しく動作しましたが、iOS-
Chartsなどのライブラリを使ってみたいため今回はUIKitなどiOSの機能で作れる方法を探しています。以前はJavaScriptのライブラリでグラフなどは描画していました。

  2. オートレイアウト  
UIScrollViewを貼り、その中にUITextFieldなどを配置し、オートレイアウトで位置を決めていきます。できることはできるでしょうが、ものすごく大変な気がします。また柔軟性もないと思います。たとえばグラフのところに棒グラフを貼っていて、さらに円グラフも追加しようと思ったらまたレイアウトのやり直しになります。

  3. UIStackView  
オートレイアウトよりは手間は少ないと思いますが、調査中です。

  4. UITextViewにaddSubViewする  
固定テキストの属性をstoryboardで決められるので良さそうですが、サブビューの位置を決めてやる必要があるのでレイアウトの手間はかかります。

期待するものは、たとえばですが

```

    reportView.addSection("基本情報")
    reportView.addItem("ユーザ名：\(userName)"
    reportView.addItem("日時：\(date)"
    ...
    
    reportView.addSection("グラフ")
    let barChartView = BarChartView( ... )
    barChartView.data = ....
    reportView.addView(barChartView)
    
    reportView.addSection("詳細結果")
    reportView.addView(detailedView)
    
```

のように足していくと実行した順に末尾に追加され、適切にレイアウトされるものです。これはイメージなので必ずしもこの通りでなくても構いません。必要な項目をビューに順次教えてやるとレポート（文書）ができあがると助かります。HTMLやLaTeXのようなマークアップ言語が適している分野です。またデザインセンスもないので、見出しの大きさなども自分で細かく調整するのではなくフレームワーク側できれいに作成されると見栄えがよくなると思います。

このような需要を満たす標準あるいは外部のフレームワークやライブラリがあれば教えてくださると幸いです。レポートを表示するというのは比較的ありふれている機能だと思いますが、日本語と英語で色々調べても見つけることができませんでした。

よろしくお願いします。
CC BY-SA 3.0
2016-03-15T05:23:03.880
23150
2016-11-25T03:10:56.970
14631
question
ios swift objective-c
iOSでレポート（文章、図などを含む）画面を作りたい
表示する項目数は本当に可変ですか？  
ストーリーボード又はxibでプロトタイプをレイアウトしてみて、項目数が固定で済みそうならAutoLayoutでの方法をおすすめします。  
方法としては、文字で表現出来る項目をNSLabelでレイアウトし、Inspectorでフォント・サイズなどを設定していけば、レポート生成時に文字の大きさなどで悩む必要がなくなります。  
また、複数のグラフについてですが、これも、layoutのconstraint(制約)をアウトレットとして持ち、outlet変数.constraintで幅でも高さでもプログラムからいつでも変えられますし、  
グラフ全体をViewとしてレイアウトし、Viewの中にUIImageで描いたImageを貼り付けるとグラフの枚数が増えても簡単に実現できるように思えるからです。

上記の方法で、レイアウトを事前に決め、コーディングは内容を生成する事に注力するというレイアウトとコンテンツの分離が出来、コードもすっきりすると思います。  
なので、事前にレイアウトしたUILabel等に、.setText()で内容を書き加えていく方がいいと思います
CC BY-SA 3.0
2016-03-16T12:17:42.227
23198
2016-03-16T12:17:42.227
14745
23150
answer