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

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

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

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

Q&A

解決済

1回答

515閲覧

UIButtonのsetImageを使うと別のUIButton位置が初期化される

math0point

総合スコア13

Swift

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

0グッド

0クリップ

投稿2019/03/16 10:13

前提・実現したいこと

Swift初心者です。
別個の画像がアサインされた複数のUIButtonが、
ランダムに配置されている状態を初期状態として、
①右方向へ同速度で移動させ
②画面から消えたらランダムに選択した画像をアサインし
③左側から再度登場し
④また右方向へ移動
という事を各UIButtonが独立に繰り返している、
という実装をしたいと考えています。

発生している問題・エラーメッセージ

②のランダムに選択した画像をアサインする際にsetImageを用いると、
②の条件を満たしたUIButtonの画像がランダム選択されたものになるまでは良いですが、
各UIButtonの位置が初期状態となってしまいます。
前述の通り各UIの動作が独立してほしいため、
一つのUIButtonが②の条件を満たしたからと言って、
他のUIButtonの位置を勝手に変更して欲しくありません。
この各UIButtonの位置が初期状態となってしまう現象を解消できる方法があれば
ご教授いただければと思います。

該当のソースコード

Swift

1class FruitContentsViewController: UIViewController { 2 @IBOutlet var moveFruitCollection: [UIButton]! 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 let xbound = 100.0 6 let s = CGPoint(x: -xbound, y: 0) 7 let e = CGPoint(x: xbound, y: 0) 8 let i = CGPoint(x: 5.0, y: 0) 9 // animation 10 for moveFruit in self.moveFruitCollection { 11 Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { (timer) in 12 moveFruit.center.x += i.x 13 if moveFruit.center.x >= (self.view.bounds.size.width+e.x) { 14 moveFruit.center.x = s.x 15 self.changeImage( moveFruit: moveFruit) 16 } 17 } 18 } 19 } 20 func changeImage( moveFruit: UIButton!){ 21 let image_list = ["f01”,”f02”,”f03”,”f04”,”f05”,”f06"] 22 let index = (Int)(arc4random_uniform(6)) 23 let fruit_uiimage = UIImage(named:image_list[index])! 24 moveFruit.setImage(fruit_uiimage, for: .normal) 25 } 26}

試したこと

補足情報(FW/ツールのバージョンなど)

Xcode10.1を用いています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

コードを見たところ、正しく動作しそうな気がするので、そのままコピペしてビルド/実行して見たところ、

swift

1let image_list = ["f01”,”f02”,”f03”,”f04”,”f05”,”f06"]

このコードの中に書かれてある が、一部全角の "になっているため、ファイル名の配列が正しく定義されておらず、実行時にエラーが発生しました。

そこだけ修正して実行したところ、意図通りの動作をしており、別のUIButton位置が勝手に初期化されるようなことは発生せず、各ボタンとも画像を切り替えながら左端から右端へのスクロールを繰り返していました。

問題が起きているコードは、本当に掲載されているコードと同じですか?
同じはずであれば、ここに書かれていないこと(Storyboardの接続等)を見直してみるべきだと思います。
また、自分で新しいプロジェクトを作成し、質問に掲載したコードをコピペして、意図通りの動作をするかどうか確認してみると良いと思います。
それで意図通り動作するものが作れたら、問題のプロジェクトと何が違うか比較して問題点を検証できると思います。

投稿2019/03/17 03:22

TakeOne

総合スコア6299

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

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

math0point

2019/03/22 23:21

ご回答ありがとうございます。またお礼が遅れまして申し訳ございません。 クォーテンションの誤記、失礼しました。 ただ、コードは正しいとのこと、安心しました。 デバッグを進めた、意図通りに動く事を確認しました。 全UIButtonに"Add missing constraints"で制約を付けていたのですが、 これをclearする事で位置が初期状態に戻るという意図しない現象が解消しました。 制約は機種間のボタン表示の差(大きさや位置のズレ)を解消するために必要、 と覚えていたのですが(これが勘違いかもしれませんが)、 上記のようにその制約が意図しない動作に起因していたようです。 ただ機種間のボタン表示の差は無くしたく、意図通りに動作との両立をさせるために、 もしご知見があればご教示頂けないでしょうか?
TakeOne

2019/03/23 01:18

質問に掲載したコードは `moveFruit.center`を設定することでボタンを位置決めして移動しているのに、AutoLayoutも使っていたら、せっかくcenter指定で移動させたボタンがAutoLayoutの設定通り初期状態に戻ってしまうことになると思います。 移動処理をcenter指定で位置決めするなら、AutoLayoutは使わず、初期位置や初期サイズは画面サイズを元に適切に計算したものを最初にframe指定で設定しておくべきと思います。 AutoLayoutを使いたいなら、center指定で移動させるのではなく、AutoLayoutの制約値をコードで変更することでボタンの位置決めを変更して移動させるべきだと思います。
math0point

2019/03/23 01:41

ご丁寧にご回答いただき、ありがとうございました。 大変参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問