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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

2回答

2444閲覧

(Swift)二つの画像を同時に動かしたいです.

oro

総合スコア6

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

0クリップ

投稿2017/05/20 20:18

###(Swift)二つの画像を同時に動かしたいです.
現在,ipadで使う顕微鏡に関するアプリケーションを作っています.
そこで,顕微鏡のプレパラートの動きと見え方を対応させるようなものを考えているのですが,うまくいきません.
具体的には,ビューの中に円形のコンテナビューを入れて,そこに表示させる画像の動きをビューに置いてある画像のドラッグによる動きと合わせたいのです.
それぞれ別々に操作することはできるのですが,ビューに置いてある画像の動きにコンテナビューの中にある画像の動きを対応させるにはどうすればいいのでしょうか.

初心者なので,伝わりにくい質問かとは思いますが,宜しくお願い致します.
###発生している問題・エラーメッセージ

###書いたソースコード
完全に初心者なので,とりあえず画像を動かせるコードだけ調べてコピペしました.
import UIKit

class ViewController: UIViewController {

let image = UIImageView() override func viewDidLoad() { super.viewDidLoad() image.image = UIImage(named: "1.JPG") // 画像のフレームを設定 image.frame = CGRect(x:0, y:0, width:304, height:304) // タッチ操作を enable image.isUserInteractionEnabled = true self.view.addSubview(image) } // 画面にタッチで呼ばれる override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { print("touchesBegan") } // ドラッグ時に呼ばれる override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { // タッチイベントを取得 let touchEvent = touches.first! // ドラッグ前の座標, Swift 1.2 から let preDx = touchEvent.previousLocation(in: self.view).x let preDy = touchEvent.previousLocation(in: self.view).y // ドラッグ後の座標 let newDx = touchEvent.location(in: self.view).x let newDy = touchEvent.location(in: self.view).y // ドラッグしたx座標の移動距離 let dx = newDx - preDx print("x:\(dx)") // ドラッグしたy座標の移動距離 let dy = newDy - preDy print("y:\(dy)") // 画像のフレーム var viewFrame: CGRect = image.frame // 移動分を反映させる viewFrame.origin.x += dx viewFrame.origin.y += dy image.frame = viewFrame self.view.addSubview(image) } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { print("End") } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. }

}
イメージ説明

###試したこと
ビューにある画像の座標情報をコンテナビューにある画像に常に送れればいいのかなと思い,その方法も調べたのですが,私の理解力が足りずよく分からない結果となりました.

###補足情報(言語/FW/ツール等のバージョンなど)
swift/storyboard

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

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

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

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

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

fuzzball

2017/05/24 05:18 編集

コードは ``` で囲って下さい。で、質問には直接関係ない(かも知れない)のですが、なぜContainerViewを使っているのでしょうか?ImageViewをそのまま貼り付けると不都合がありますか?
oro

2017/06/29 06:19

返信遅れて申し訳ありません. 丁寧な回答ありがとうございます. コンテナビューを使って複数のビューで画像を表示する理由についてですが,画像が表示される場所は移動させず,表示する箇所を変えたいと考えているためです. そのため,質問で挙げた画像を例にすると,下の画像は画像の表示される箇所は変更せずに表示される場所だけを移動できるようにし,それに対応して,上の画像は画像を表示する場所は変えずに表示する画像の箇所を変更というものにしたいのです. 拙い文章で申し訳ないのですが,宜しくお願い致します.
guest

回答2

0

ビューにある画像の座標情報をコンテナビューにある画像に常に送れればいいのかなと思い

の参考になるかもしれないリンク。
Swift3.0で画像の切り抜き

UIImageの一部分を切り出して、新たなUIImageを作成出来ます。

投稿2017/05/24 06:25

fuzzball

総合スコア16731

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

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

Bongo

2017/05/24 06:49

なるほど、大きな画像から必要な部分を切り出して顕微鏡像用のビューに表示する方式の方が簡潔になりそうです。情報ありがとうございます。
guest

0

2つのビューを同じタイミングで動かす考え方については、単純に複数のビューに対して同様の手順をとるだけで問題ないかと思います(現在のところtouchesMovedの中で1枚のビューしか動かしていませんが、ここで複数のビューを操作)。

ストーリーボード上に配置したビューを操作する方法をお探しでしょうか?その場合は、配置したビューとコード上のアウトレットをつないで対応づけた上で、同じようにそのビューに対して操作を行うという形になるでしょう。
アウトレットに関する記事がありましたので、ご参考にいかがでしょうか。
アウトレット - Swift による iOS 開発入門

※顕微鏡の動きといいますと、プレパラートの動きに合わせて視野が逆に動く...というアレでしょうか。子供の頃を思い出して懐かしくなりました。

投稿2017/05/20 21:38

Bongo

総合スコア10807

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

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

oro

2017/05/24 04:05

回答ありがとうございます。 回答を受け、いろいろやってみてるのですが、なかなか上手くいきません。 1つ質問なのですが、操作するビューコントローラーの画像と違うビューコントローラーの画像を操作する画像に対応させる時に、操作する画像があるビューコントローラーで違うビューコントローラーの画像を指定できるのでしょうか? 分かりにくい質問で申し訳ありません。 宜しくお願いします。
Bongo

2017/05/24 05:29 編集

今回の場合、一つの画面内にプレパラートの画像と顕微鏡拡大像の画像があり、プレパラートを動かすと拡大像も動く、というデザインですので、この部分に関してはあえて複数のビューコントローラーを使う必要はないかと思います。 ご提示のコードのviewDidLoadの中にself.view.addSubview(image) という部分がありますが、ビューコントローラーが管理しているself.viewは他のビューを入れ子にして持つことができますので、プレパラートのUIImageViewと拡大像のUIImageViewを共にself.viewのサブビューとして追加できます(両者は同じ親を持つ兄弟関係に当たります)。これらをビューコントローラーから同時に操作します。 なお、ご提示のコードの場合は、アプリを実行した際に新しくUIImageViewを作って、それをサブビューとして追加する方法をとっていますが(このため、ビューコントローラーと一つの画像は一対一で対応するものとご想像されたかもしれません)、画像のようにストーリーボード上でビューを配置していってもビューの親子・兄弟関係を組み立てることができます。この場合に、アウトレットの機能によってストーリーボード上の各ビューとSwiftコード上の変数を繋ぎ、コード上からビューを操作できるようにします(参考サイトでもUILabelやUITextFieldをアウトレットを介して繋いでいますが、これらラベルやテキストフィールドもビューの一種です)。なんだかややこしくなってしまいすみません。 ちなみに、複雑な画面構成の場合、複数のビューコントローラーを用意して、メインのビューコントローラーが操作するビューの子として、別のビューコントローラーが操作するビューを追加する...といった方法をとることもあるようです。
oro

2017/06/29 06:12

返信遅れて申し訳ありません. 丁寧な回答ありがとうございます. コンテナビューを使って複数のビューで画像を表示する理由についてですが,画像が表示される場所は移動させず,表示する箇所を変えたいと考えているためです. そのため,質問で挙げた画像を例にすると,下の画像は画像の表示される箇所は変更せずに表示される場所だけを移動できるようにし,それに対応して,上の画像は画像を表示する場所は変えずに表示する画像の箇所を変更というものにしたいのです. 拙い文章で申し訳ないのですが,宜しくお願い致します.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問