

xcode8 & swiftでiPad用のアプリを作っています。  
Storyboard & Autolayoutを使っています。  
iOS10.xがターゲットです。

UIScrollViewの中にUITableViewを入れて上下左右共に画面よりも大きな表を表示し、上下左右にスクロールして表示ができています。(↓こんなイメージ)

[![表全体のスクロール](https://i.stack.imgur.com/biDEZ.png)](https://i.stack.imgur.com/biDEZ.png)

現在、画面の一部(例えば1列目)のみ左右固定にして2列目以降をスクロールさせようとしていますが、どうすれば実現できるのか見当が付きません。(↓こんなイメージ)

[![一部固定のスクロール](https://i.stack.imgur.com/Q9XIG.png)](https://i.stack.imgur.com/Q9XIG.png)

何かわかる方がおられたら教えていただけないでしょうか？  
「ここを見れば」とか「この本を見れば」とかでも構いません。  
よろしくお願いします。


CC BY-SA 3.0
2017-05-25T07:04:51.180
35004
2017-09-22T01:53:31.723
23366
question
swift ios
iOSで画面の一部を固定したスクロールの実現方法


名前のビューとその他のビューを分けて２つ作れば良いのではないでしょうか？  
それぞれ、UIScrollViewDelegateを設定し、互いにスクロールを伝達しあえば良いとおもいます。


CC BY-SA 3.0
2017-05-26T16:30:42.127
35048
2017-05-26T16:30:42.127
3693
35004
answer


`UITableView`と`UIScrollView`の組み合わせで実現するのはあまり向いてないと思います。できなくはないですが、制御しなければならないことがすごくたくさんになるのでとても大変です。

`UICollectionView`を使うことを検討してみてはいかがですか？`UICollectionView`には`sectionHeadersPinToVisibleBounds`というプロパティがあるので、もしそれで望みの動作が実現できるなら、それが一番簡単だと思います。

そうでない場合、`UICollectionView`のレイアウトをカスタマイズして、固定ヘッダーを実現する方法があります。  
具体的には`layoutAttributesForSupplementaryViewOfKind(elementKind:atIndexPath
indexPath:)`でスクロールの左端（=`contentOffset.x`）に常に張り付くようにします。

少し古いですがこちらの記事が参考になると思います。  
<http://dativestudios.com/blog/2015/01/10/collection_view_sticky_headers/>

似たような画面をかなり汎用的に実現できる既存のライブラリとして、  
<https://github.com/stuffrabbit/SwiftSpreadsheet>

があります。こちらは`UICollectionView`を用いてスプレッドシートのようなUIを実現するためのカスタムレイアウトを提供しています。これがそのまま使えないとしても、コードは非常に参考になると思います。

もう一つは私が作ったものですが  
<https://github.com/kishikawakatsumi/SpreadsheetView>

というのもあります。これは`UIScrollView`の組み合わせで実現しています。上記のライブラリと比べるとかなりコードが複雑なことがわかると思います。

これらを参考にして、やりたいことにマッチするアーキテクチャを選択するのが良いと思います。


CC BY-SA 3.0
2017-05-28T05:47:07.367
35083
2017-05-28T05:47:07.367
5519
35004
answer