質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1388閲覧

UISearchBarを上部に固定する方法

Ytan

総合スコア39

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/11/19 16:49

編集2020/11/20 14:22

現状

TableViewにsearchBarを設置して文字を入力するとそれに応じてAPIから検索結果を受け取り
TableViewに表示してますが、Searchbarがスクロール時に上部から無くなりCellの数分スクロールが
終わった下部に出てしまいます。

Headerを使ったりSearchBarController(?)に定義したりなどあると思うのですが
今の環境だとベストなものは何でしょうか?

入力してenterを押す前は上部にあり
入力前
enterを押してcellに情報が入ると下にスクロールした最下部に留まってしまいます。
再度文字を検索しても変わりません。
Enter後

import UIKit import PKHUD class MovieSearchViewController: UIViewController, UISearchBarDelegate { @IBOutlet weak var table: UITableView! @IBOutlet weak var search: UISearchBar! @IBOutlet weak var indicater: UIActivityIndicatorView! private var items:[MovieItem] = [MovieItem]() var alertController: UIAlertController! override func viewDidLoad() { super.viewDidLoad() self.setupTable() self.setupNavigationBackground() } } //エラーアラート func alert(title:String, message:String) { alertController = UIAlertController(title: title, message: message, preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) present(alertController, animated: true) } //SearchButtounClicked func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { view.endEditing(true) fechData() } func fechData(){ search.resignFirstResponder() guard let text = search.text, !text.isEmpty else { return } guard let query = text.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { print("パーセントエンコーディング失敗") return } //LoadingAction Start HUD.show(.progress) items.removeAll() URLSession.shared.dataTask(with: URL(string: "https://api.themoviedb.org/3/search/movie?api_key=MYAPIKEY&language=ja&query=(query)&page=1")!, completionHandler: {data, response, error in guard let data = data else { print(error?.localizedDescription ?? "Unknown error") return } var result: MovieStruct? do { result = try JSONDecoder().decode(MovieStruct.self, from: data) } catch{ print("JSON perse error") } guard let finalResult = result else { return } let newMovies = finalResult.results self.items.append(contentsOf: newMovies) DispatchQueue.main.async { self.table.reloadData() //検索エラーメッセージ if newMovies.isEmpty { self.alert(title: "エラー",message: "該当する映画がありませんでした") } //LoadingAction Stop HUD.flash(.progress) } }).resume() } } extension MovieSearchViewController { private func setupTable() { table.delegate = self table.dataSource = self search.delegate = self table.register(TableViewCell.nib(), forCellReuseIdentifier: TableViewCell.identifier) } func searchBarShouldEndEditing(_ searchBar: UISearchBar) -> Bool { search.text = "" search.autocapitalizationType = .none return true } } extension MovieSearchViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return items.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = table.dequeueReusableCell(withIdentifier: TableViewCell.identifier, for: indexPath) as! TableViewCell cell.setcell(item: items[indexPath.row]) return cell } } extension MovieSearchViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) self.hidesBottomBarWhenPushed = true performSegue(withIdentifier: "registerControl", sender: items[indexPath.row]) self.hidesBottomBarWhenPushed = false } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "registerControl" { let nextVC:RegisterViewController = segue.destination as! RegisterViewController if let selectedMovies = sender as? MovieItem { nextVC.movie = selectedMovies } } } }

余談

SearchBarに英字入力すると一文字目が大文字から始まりますが
Search Barの先頭文字を小文字にしたい

こちらを参考に変えてみたのですが反映されません。
大文字からでも困らないので余談ですがわかる方がいらっしゃいましたら教えてもらいたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TsukubaDepot

2020/11/20 08:57

TableViewの設定を含め、全体的なコードを拝見しないと何とも言い難いところかと思います。 「Searchbarがスクロール時に上部から無くなりCellの数分スクロールが終わった下部に出てしまいます」という状況も理解し難いので、このような現象がでるサンプルコードを上げていただいた方が解決が早いと思います。 ご質問から推測されるのは、TableView Cell の一つに SearchBar を配置しているように読めるのですが、実際はどのようにされているのでしょうか。 常に上部に SearchBar を固定したいのであれば、 UITableView の上辺 (topAnchor)に接するように UISearchBar をおけば良さそうに思えるのですが、それとはまた別の実装をかんがえられているのでしょうか。
Ytan

2020/11/20 14:32

コードと画像を追加しました。 TableView内にSeaarchBarを設置したのでおそらく TableView Cell の一つに SearchBar を配置していました。 TableViewに入れた状態だと移動してしまうのはCellが再利用されて一番下に来てしまうからでしょうか? しかし、UITableView の上辺に接するように置いてスクロールも問題なくできました。 何かベストアンサーに選ばさせていただきたいので、回答を何かご記入よろしくお願いします。
guest

回答1

0

ベストアンサー

おそらく、UITableView の Cell として UISearchBar を設定しているのだと思います。

そうではなく、UITableView から出して、それぞれに適切な Constraints (制約)をつければこの場合はうまくいくのではないでしょうか。

投稿2020/11/21 05:12

TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ytan

2020/11/21 14:04

回答の方法で上手くいきました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問