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

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

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

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

430閲覧

画像が画面領域外に出た場合、画像が消えるようにしたいです。

magiee

総合スコア28

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2020/04/23 13:05

現状のswiftの動き

①タップすると画像が現れる。
②傾けると画面領域内で加速度センサによって画像が動く。
③ドラッグすると、画像がついてくる。  
④ドラッグして画面領域外に出した場合、画像が消える。 ←今回修正したい部分
⑤もしくは再度タップすると画像が消える。 ←ここは出来てます

実現したいこと

④の実現

分からない所

スクリーンサイズの取得、画像を消すと言うコードも分かるのですが、
「スクリーンサイズよりも画像が出た場合」っと言うコードの表し方が分かりません。
ご教授のほど、よろしくお願いします。
let scrSize: CGSize = UIScreen.main.bounds.size スクリーンサイズ取得。
.removeFromSuperview() 画像を消すコード

該当のソースコード

import UIKit import CoreMotion class ViewController: UIViewController { var coin = UIImageView() var coinCount = 0 @IBAction func addImage(_ sender: UITapGestureRecognizer) { if coinCount == 0 { coin = UIImageView(image: UIImage(named: "daiya")) coin.frame = CGRect(x: 0, y: 0, width: 110, height: 110) coin.center = sender.location(in: self.view) coin.contentMode = .scaleToFill coin.clipsToBounds = true coin.center = sender.location(in: self.view) UIView.animate(withDuration: 0.10, animations: { }) { (Bool) -> Void in } self.view.addSubview(coin) } else if coinCount == 1 { coin.removeFromSuperview() } coinCount = coinCount + 1 coinCount = coinCount % 2 startGame() } var index = 0 var maxIndex = 10 var dX: [CGFloat] = [] var dY: [CGFloat] = [] let cmManager = CMMotionManager() let scrSize: CGSize = UIScreen.main.bounds.size var mag: Double = 1.0 var vx, vy: Double? override func viewDidLoad() { super.viewDidLoad() vx = 0.0 vy = 0.0 dX = Array(repeating: CGFloat(0.0), count: maxIndex) dY = Array(repeating: CGFloat(0.0), count: maxIndex) startGame() } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { cmManager.stopDeviceMotionUpdates() } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { vx = 0.0 vy = 0.0 for i in 0..<dX.count { print("dx[(i)]: (dX[i]), dy[(i)]: (dY[i])") } let amp = 1.0 vx = Double(dX.reduce(0.0) { $0 + $1 } / CGFloat(dX.count)) * amp vy = Double(dY.reduce(0.0) { $0 + $1 } / CGFloat(dY.count)) * amp print("vx: ", vx!, "vy: ", vy!) startGame() } @IBAction override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { print("touchesMoved", touches.count) let aTouch = touches.first! let location = aTouch.location(in: coin) let prevLocation = aTouch.previousLocation(in: coin) var myFrame: CGRect = coin.frame let deltaX: CGFloat = location.x - prevLocation.x let deltaY: CGFloat = location.y - prevLocation.y dX[index] = deltaX dY[index] = deltaY index += 1 index %= maxIndex myFrame.origin.x += deltaX myFrame.origin.y += deltaY coin.frame = myFrame } func startGame() { cmManager.deviceMotionUpdateInterval = 0.03 let handler: CMDeviceMotionHandler = { (motionData: CMDeviceMotion?, error: Error?) -> Void in self.stepGame(motionData: motionData, error: error) } cmManager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: handler) } func stepGame(motionData: CMDeviceMotion?, error: Error?) { var xMin, xMax, yMin, yMax: Int xMin = Int(coin.frame.width / 2) xMax = Int(scrSize.width) - xMin yMin = Int(coin.frame.height / 2) yMax = Int(scrSize.height) - yMin if let motion = motionData { let gravity = motion.gravity vx = vx! + gravity.x * mag vy = vy! - gravity.y * mag var x: Int = Int(Double(coin.center.x) + vx!) var y: Int = Int(Double(coin.center.y) + vy!) if (x < xMin) { x = xMin; vx = 0.0 } else if (x > xMax) { x = xMax; vx = 0.0 } if (y < yMin) { y = yMin; vy = 0.0 } else if (y > yMax) { y = yMax; vy = 0.0 } coin.center = CGPoint(x: x,y: y) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }

使用している言語

swift
Xvode 11.4

ご教授のほど、よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

先日立てられた質問に hoshi-takanori さんが図付きで解説されていましたが、そちらはご理解されていますでしょうか。かなりヒントが含まれていましたので、ヒントを参考によく考えてみてはいかがでしょうか。

たとえば、

swift

1 // frameにmyFrameを追加. 2 myBall.frame = myFrame 3 4 // スクリーンの幅を取得 5 let scrWidth = UIScreen.main.bounds.size.width 6 // 現在のスクリーンの幅と表示しているビューのX座標を表示する 7 print("width: ", scrWidth) 8 print("center.x: ", myBall.center.x)

という感じにコードを変更すると、現在のスクリーン幅とドラッグ中のビューの中心X座標がデバッグウインドウに表示されます。

消してみたいビューをドラッグしていくと、スクリーン幅よりもビューの中心座標が大きくなる条件があることに気づかれると思います。

あとは、上記のコードでいえばscrWidthよりもmyBall.center.xが大きくなる条件を記述し、その条件でビューを消すなり非表示にするなりすればいいと思います。

ちなみに、removeFromSuperview()だと不都合が生じますが、まずは条件判定を行い、その条件でビューを消すなりなんなりする処理をご自身で記述してみることが重要です。

投稿2020/04/23 14:49

TsukubaDepot

総合スコア5086

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

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

magiee

2020/04/23 23:55

override func touchesEnded のところで、以下のコードを記述すると自分の求めている形となりました。ただ、コードの書き方として、もっとシンプルに記載するやり方、また便利なツールがありましたら教えていただけないでしょうか?? print("width: ", scrWidth) print("height: ", scrHeight) print("center.x: ", coin.center.x) print("center.y: ", coin.center.y) if coin.center.x > scrWidth { coin.removeFromSuperview() coinCount = coinCount - 1 } else if 0 >= coin.center.x { coin.removeFromSuperview() coinCount = coinCount - 1 } if coin.center.y > scrHeight { coin.removeFromSuperview() coinCount = coinCount - 1 } else if 0 >= coin.center.y { coin.removeFromSuperview() coinCount = coinCount - 1 }
TsukubaDepot

2020/04/24 00:26

基本的な書き方そのものは問題ないとおもいます。 if文の書き方としては、2つの事象を同時に比較する方法があるので、それを使うと少しすっきりした形になりますので、参考にしてみてください。 一つ目はor演算子(||)を使って2つの条件を列記する方法、もう一つは範囲演算子のパターンマッチを使って記述する方法です。 if myBall.center.x < 0 || scrWidth < myBall.center.x { print("範囲外1") } if !(0..<scrWidth ~= myBall.center.x) { print("範囲外2") }
magiee

2020/04/24 12:18

回答して頂き、ありがとうございました。 無事に実行することが出来ました。 また、様々なパターンを教えて頂きありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問