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

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

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

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Xcode

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

Swift

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

解決済

【swift】tableviewをスクロールした際のカクカクを解消したい

GO96805224
GO96805224

総合スコア13

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Xcode

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

Swift

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

1回答

0評価

0クリップ

395閲覧

投稿2022/02/18 13:06

アプリ開発初心者です。
QItaのAPI から取得したデータをtableviewに表示させるアプリを作成しましたが、
tableviewをスクロールさせると画面がカクカクしてスムーズにスクロールできません。
「tableview カクカク」で検索し、対処方法を調べましたがよく分かりませんでした。

tableviewの動きをスムーズにする方法をご教授お願いいたします。

swift

import UIKit struct Qiita: Codable { let title: String let createdAt: String let user: User let url: String enum CodingKeys: String, CodingKey { case title = "title" case createdAt = "created_at" case user = "user" case url = "url" } } struct User: Codable { let name: String let profileImageUrl: String enum CodingKeys: String, CodingKey { case name = "name" case profileImageUrl = "profile_image_url" } } class ViewController: UIViewController { private let cellId = "cellId" private var qiitas = [Qiita]() let tableView: UITableView = { let tv = UITableView() return tv }() override func viewDidLoad() { super.viewDidLoad() view.addSubview(tableView) tableView.frame.size = view.frame.size tableView.delegate = self tableView.dataSource = self tableView.register(QiitaTableViewCell.self, forCellReuseIdentifier: cellId) navigationItem.title = "Qitaの記事" getQiitaApi() } private func getQiitaApi(){ guard let url = URL(string: "https://qiita.com/api/v2/items?page=1&per_page=20") else { return } var request = URLRequest(url: url) request.httpMethod = "GET" let task = URLSession.shared.dataTask(with: url) { (data, response, err) in if let err = err { print("情報の取得に失敗しました。", err) return } if let data = data { do { // let json = try JSONSerialization.jsonObject(with: data, options: .fragmentsAllowed) let qiita = try JSONDecoder().decode([Qiita].self, from: data) self.qiitas = qiita DispatchQueue.main.async { self.tableView.reloadData() } print("json: ", qiita) } catch(let err) { print("情報の取得に失敗しました。:", err) } } } task.resume() } } extension ViewController: UITableViewDelegate, UITableViewDataSource { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 80 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return qiitas.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! QiitaTableViewCell // cell.backgroundColor = .red cell.qiita = qiitas[indexPath.row] return cell } } class QiitaTableViewCell: UITableViewCell { var qiita: Qiita? { didSet { bodyTextLabel.text = qiita?.title let url = URL(string: qiita?.user.profileImageUrl ?? "") do { let data = try Data(contentsOf: url!) let image = UIImage(data: data) userImageView.image = image }catch let err { print("Error : \(err.localizedDescription)") } } } let userImageView: UIImageView = { let iv = UIImageView() iv.contentMode = .scaleAspectFill iv.translatesAutoresizingMaskIntoConstraints = false iv.clipsToBounds = true return iv }() let bodyTextLabel: UILabel = { let label = UILabel() label.text = "something in here" label.font = .systemFont(ofSize: 15) label.translatesAutoresizingMaskIntoConstraints = false return label }() override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) addSubview(userImageView) addSubview(bodyTextLabel) [ userImageView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 10), userImageView.centerYAnchor.constraint(equalTo: centerYAnchor), userImageView.widthAnchor.constraint(equalToConstant: 50), userImageView.heightAnchor.constraint(equalToConstant: 50), bodyTextLabel.leadingAnchor.constraint(equalTo: userImageView.trailingAnchor, constant: 20), bodyTextLabel.centerYAnchor.constraint(equalTo: centerYAnchor), ].forEach{ $0.isActive = true } userImageView.layer.cornerRadius = 50 / 2 } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

Tomato45

2022/02/19 00:36

1. 「QItaのAPI から取得したデータを」とありますが、「QIta」とは何でしょうか?URLRequestの構文を見るからに、それは「Qiita」の間違えのように見えますが。 2. tableView(_:numberOfRowsInSection:)で返ってくる件数が何件かを記述した方が問題の起因がわかると思いますが?まず一度に20件か30件ずつqiitasに渡してみては?自分だったら「Swift UITableView infinite scrolling」とかで検索してみますけど。
GO96805224

2022/03/02 13:45

アドバイスいただきありがとうございます。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Xcode

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

Swift

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。