実現したいこと
tableviewをスクロールした際にcellが並ぶ画面(tableview)の上に
(浮いて見えるように)固定されたUIButtonがcellの邪魔にならないように非表示にし、
スクロールをしてない時は表示するようにしたいです。
以下のサイトを参考に作ってみましたが、シミュレーターでスクロールをしてみてもUIボタンは非表示になりませんでした。
http://blog.all-in.xyz/2016/06/20/how-to-put-button-on-tableview-which-will-not-scroll-with-table/
viewcontrollerには以下のようにコーディングしました。
ViewController
1import UIKit 2 3class ViewController: UIViewController { 4 5 // UIButton の表示/非表示を管理 6 private var isButtonDisplayed: Bool = true 7 8 @IBOutlet weak var addPictureButton: UIButton! 9 10 // 先ほど実装した UITableView 側の ViewController の delegate に self を設定 11 override func prepare(for segue: UIStoryboardSegue, sender: Any!) { 12 if segue.identifier == "ArticleViewControllerSegue" { 13 let vc = segue.destination as! ArticleViewController 14 vc.delegate = self 15 } 16 } 17 18 override func viewDidLoad() { 19 super.viewDidLoad() 20 // Do any additional setup after loading the view, typically from a nib. 21 } 22} 23 24// スクロール発生時に通知されるプロトコルを実装 25extension ViewController: ArticleViewControllerDelegate { 26 // スクロールアップ時に UIButton を表示する 27 func viewDidscrolledUp() { 28 if !isButtonDisplayed { 29 addPictureButton.isHidden = false 30 isButtonDisplayed = true 31 } 32 } 33 34 // スクロールダウン時に UIButton を非表示にする 35 func viewDidscrolledDown() { 36 if isButtonDisplayed { 37 addPictureButton.isHidden = true 38 isButtonDisplayed = false 39 } 40 } 41}
ArticleViewController
1import UIKit 2 3// スクロールの発生を検知してUIButtonの表示を切り替えるためのプロトコル 4protocol ArticleViewControllerDelegate: class { 5 func viewDidscrolledUp() 6 func viewDidscrolledDown() 7} 8 9class ArticleViewController: UIViewController { 10 11 @IBOutlet weak var tableview: UITableView! 12 13 weak var delegate: ArticleViewControllerDelegate? 14 // スクロールの開始点 15 var scrollBeginingPoint: CGPoint! 16 17 // ドラッグしてスクロールが発生する直前に呼び出される 18 func scrollViewWillBeginDragging(scrollView: UIScrollView) { 19 scrollBeginingPoint = scrollView.contentOffset 20 } 21 22 // スクロールが発生している間常に呼び出される 23 func scrollViewDidScroll(scrollView: UIScrollView) { 24 let currentPoint = scrollView.contentOffset 25 26 if scrollBeginingPoint.y < currentPoint.y { 27 print("scroll to bottom") 28 delegate?.viewDidscrolledDown() 29 } else { 30 print("scroll to top") 31 delegate?.viewDidscrolledUp() 32 } 33 } 34 35 override func viewDidLoad() { 36 super.viewDidLoad() 37 // Do any additional setup after loading the view. 38 tableview.delegate = self 39 tableview.dataSource = self 40 } 41 42} 43 44extension ArticleViewController: UITableViewDelegate { 45} 46 47extension ArticleViewController: UITableViewDataSource { 48 49 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 50 // スクロールさせるために50行のCellを表示 51 return 50 52 } 53 54 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 55 // CellのtextLabelにindexPath.rowを表示 56 let cell = UITableViewCell(style: .default, reuseIdentifier: "cell1") 57 cell.textLabel?.text = String(indexPath.row) 58 return cell 59 } 60 61} 62
どんなことでも構いませんのでアドバイス、お待ちしておりますm(_ _)m
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。