試行錯誤 10.4 (シュッと⭐️・ジグソーパズル)
前回、正解エリアを作ってCGRectContainsPointを使って判定する方法を考えてみましたが、正解エリアを作るタイミングを変えた方が良さそう...と思っていました。
そこへ、Toshiさんから⭐️アドバイス第2弾!⭐️
本当にありがとうございます!
m(__)m
@sktchap みましたー。記事に書いているように、ドラッグするたびに正解エリアをaddSubviewすると赤いViewだらけになっちゃうので、あらかじめ並べておくのがいいかと思いまーす。
— とし☆あずきちゃんと虹色クレヨン出版 (@toshi586014) 2015, 11月 23
あらかじめ作っておく系、やってみました!(≧▽≦)
正解エリアには、分かりやすいように赤色をつけています。
で、プログラムも...
最初のものに比べたら、かなりシュッとしてませんか!?ヽ(*´v`*)ノ
import UIKit class ViewController: UIViewController { var correctCount = 0 var answerAreaAray:[UIView] = [] override func viewDidLoad() { super.viewDidLoad() //台を作る let baseImg = UIImageView(frame: CGRectMake(10, 50, 300, 300)) baseImg.backgroundColor = UIColor.grayColor() self.view.addSubview(baseImg) //ピースの数(1〜16)を入れる配列 var pieceAray:[Int] = [] for i in 0...15{ pieceAray.append(i+1) } //4×4=16個のピースを作る for j in 0...3{ for i in 0...3{ //配列の要素数からランダムに値を取り(1〜16)、indexに入れる let index = Int(arc4random_uniform(UInt32(pieceAray.count))) //配列の(index+1)番目の要素を取り出しnumに入れる let num = pieceAray[index] //配列から取り除く pieceAray.removeAtIndex(index) //シャッフルされた数numを使って、画像をランダムに割り振ったimageViewを作る let pieces = UIImageView(frame: CGRectMake(CGFloat(75*i),CGFloat(75*j+40), 95, 95)) let str = String(format:"img%d.png",num) pieces.image = UIImage(named: str) pieces.tag = num self.view.addSubview(pieces) //今回、変更したところ //正解エリアを作っておく let answerArea = UIView(frame:CGRectMake(0, 0, 15, 15)) answerArea.center = pieces.center answerArea.backgroundColor = UIColor.redColor() answerAreaAray.append(answerArea) self.view.addSubview(answerArea) //ピースをばらまいた状態にする let yoko = Int(arc4random_uniform(225) + 50) let tate = Int(arc4random_uniform(225) + 80) var point:CGPoint = pieces.center point.x = CGFloat(yoko) point.y = CGFloat(tate) pieces.center = CGPointMake(point.x, point.y) //UIPanGestureRecognizerを使用 let movePieces:UIPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: "dragPieces:") pieces.addGestureRecognizer(movePieces) pieces.userInteractionEnabled = true } } } ///ピースをドラッグしたら呼ばれる関数 func dragPieces(sender:UIPanGestureRecognizer){ //ピースをドラッグし終わったら if sender.state == UIGestureRecognizerState.Ended{ let targetImg:UIView = sender.view! //今回、変更したところ //answerAreaArayのviewと、targetImgの中心が重なったら正解とする for(var i=0; i<answerAreaAray.count; i++){ let answerView = answerAreaAray[targetImg.tag-1] if (CGRectContainsPoint(answerView.frame, targetImg.center)){ //正解座標に移動 targetImg.center = CGPointMake(answerView.center.x, answerView.center.y) //正解後は動かないように targetImg.userInteractionEnabled = false //正解数をカウント correctCount++ //全ピースが正解したら if correctCount == 16{ print("Congratulations!") } } } }else{ let point: CGPoint = sender.translationInView(self.view) let movedPoint: CGPoint = CGPointMake(sender.view!.center.x + point.x, sender.view!.center.y + point.y) sender.view!.center = movedPoint sender.setTranslation(CGPointZero, inView: self.view) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
正解エリアをviewDidLoadで作り、配列にはtagではなくviewそのものを入れてみました。
そうすると、後々使いやすいように思いました♪
Toshiさん、お忙しい中本当にありがとうございました!
コードも気分も、すっきり!です(o’∀`)ノ