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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

3回答

4005閲覧

非同期通信後に、結果を受けて画面更新をする手法

rox

総合スコア179

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

2クリップ

投稿2016/01/21 09:32

開発に行き詰っている部分がありまして、初めて質問させていただきます。よろしくお願いいたします。

イメージとしては以下のgifの「お知らせ」画面のように、通信結果を受けて結果を表示する画面を作りたいと考えています。

達成したいイメージ
引用元:iOS アプリの UI でこれだけはおさえたい、読み込み中の体験を向上させる基本 UI パターン3つ

通信完了後にあたる画面はStoryboardで作成済みなのですが、ローディング中の画面(白背景+UIActivityIndicatorView)をどのように実装すれば良いかわかりません。

といいますのも、UIActivityIndicatorViewを画面中央に配置しても、ローディング中は空のtableViewが背後に表示されるためです(ローディング完了後にtableView.reloadData()は実行しています)

ローディング画面を実装のためにいろいろ考えましたが、、、

  1. viewDidLoadで白背景viewをaddSubviewしておいて、ローディング完了後にremoveFromSuperviewを実行して取り除く?
  2. そもそも白背景しかないviewを作って遷移し、ローディング完了後に実際に表示させたいviewを読み込んで、setNeedsDisplay()を呼び出す?
  3. SVProgressHUDなどのライブラリで、背景付きのスピナーを回す

最後のライブラリを使う手法は最後の手段ですが、よくみかけるUIだけにみなさんがどのように実装しているかが気になっています。

こういう感じでやっているよ、と気軽に教えていただけるととてもうれしいです!

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

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

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

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

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

guest

回答3

0

ベストアンサー

1が素直で良いように思います。

代替案として2つ

a. UIActivityIndicatorView を画面いっぱいに表示

  • 実装方法
  • UIActivityIndicatorView の backgroundColor を white 、且つ frame を画面いっぱいに設定
  • ロードが完了した時点で UIActivityIndicatorView を stopAnimating() すれば

背景ごと勝手に非表示になります( hidden = true になる /下の view のタッチは拾うはず)

  • メリット/デメリット
  • ローディング画面を繰り返し使いたい場合に便利
  • 画面いっぱいの UIActivityIndicatorView は storyboard や xib じゃ実装できなかったかも

swift

1// メンバ変数として宣言 2let indicator = UIActivityIndicatorView() 3 4// viewDidLoad とかで 5indicator.backgroundColor = UIColor.whiteColor() 6self.view.addSubview(indicator) 7 8// viewDidLayoutSubviews() で 9// iOS の問題でこれだけはレイアウト完了後じゃないとダメだった気がする 10indicator.frame = self.view.frame 11 12// ローディング開始時 13indicator.startAnimating() 14 15// ローディング完了時 16indicator.stopAnimating() 17

b. tableView の footer をなくす

  • 質問者さんのおっしゃる"空のtableView"というのが、もし要素を入れていないのにセパレーターだけ画面いっぱいにある状態のことだとしたら、そのセパレーターは以下の1行でなくせます。

swift

1tableView.tableFooterView = UIView(frame: CGRectZero)
  • これで セパレーターのない tableView (何も設定していなければ真っ白な背景)になるはずです
  • もしこれ以外の場合、空部分のセパレーターを表示させたいのであればこの方法は向いてませんね

なお、どちらのコードも動作確認はしていません。
はじめに書いたように、質問者さんの案が良いと思いますが、参考までに。

投稿2016/01/21 11:47

編集2016/01/21 11:54
taiju59

総合スコア54

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

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

rox

2016/01/22 04:08

ご回答ありがとうございます。 UIActivityIndicatorViewを画面いっぱいにする方法は目からウロコでした。そりゃそうだという話ですね。 試してみたいと思います!
guest

0

1番で良いと思いますが、「viewDidLoadで白背景viewをaddSubview」しなくても、Storyboard上で、UIActivityIndicatorViewの間に白背景viewを追加しておいて、ローディング完了後に非表示(hidden)にすればいいんじゃないでしょうか?

似たケースとして、データが無いときに「データがありませんview」を表示するために、この方法で実装したことがあります。

投稿2016/01/22 05:17

fuzzball

総合スコア16731

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

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

0

1番の方法で良いと思います。

投稿2016/01/21 09:52

Stripe

総合スコア2183

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

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

rox

2016/01/22 04:07

ご回答ありがとうございます。後押ししていただけてうれしいです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問