2016-04-22 5 views
0

9つの等間隔のフレームに8つのUIImageViewsがあります。 2つ(上の行)を除くすべてのビューはタッチされたときにemptySpotに移動します。理由を理解できません。パズルゲームの特定のUIImageViewsが新しいCGPointセンターに移動しません

(私のBLOCKQUOTE内のコードの最初の数行は、残りのようなコードとしてフォーマット/ショーをしない理由注意点として、私は把握することはできません!?)

import UIKit 
import Foundation 
var tiledViewsStack = [UIImageView]() 
var emptySpot = CGPoint() 

class PhotoViewController: UIViewController, 
UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

//Choose an image from Photo Library and display on screen in displayImageView 

@IBOutlet weak var displayImageView: UIImageView! 

@IBAction func choosePicFromLibrary(sender: AnyObject) { 
    let imagePicker: UIImagePickerController = UIImagePickerController() 

    imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary 
    imagePicker.delegate = self 
    imagePicker.modalPresentationStyle = UIModalPresentationStyle.Popover 

    if (imagePicker.popoverPresentationController != nil) { 
     imagePicker.popoverPresentationController!.sourceView = sender as! UIButton 
     imagePicker.popoverPresentationController!.sourceRect = (sender as! UIButton).bounds 
    } 
    presentViewController(imagePicker, animated: true, completion: nil) 
} 

@IBAction func takePhoto(sender: AnyObject) { 
    let imagePicker: UIImagePickerController = UIImagePickerController() 

    imagePicker.sourceType = UIImagePickerControllerSourceType.Camera 
    imagePicker.delegate = self 
    imagePicker.modalPresentationStyle = UIModalPresentationStyle.Popover 

    if (imagePicker.popoverPresentationController != nil) { 
     imagePicker.popoverPresentationController!.sourceView = sender as! UIButton 
     imagePicker.popoverPresentationController!.sourceRect = (sender as! UIButton).bounds 
    } 
    presentViewController(imagePicker, animated: true, completion: nil) 
} 

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
    dismissViewControllerAnimated(true, completion: nil) 
    displayImageView.image = info[UIImagePickerControllerOriginalImage] as! UIImage! 
} 

func imagePickerControllerDidCancel(picker: UIImagePickerController) { 
    dismissViewControllerAnimated(true, completion: nil) 
} 



//Cut photo into 9 tiles 
    //Cut selected image into 9 pieces and add each cropped image to tileImageStack array 

var tileImageStack = [AnyObject]() 

var allCenters = [NSValue]() 

@IBAction func randomize(sender: AnyObject) { 

let selectedImageWidth = displayImageView.image!.size.width 
let selectedImageHeight = displayImageView.image!.size.height 

let tileSize = CGSizeMake(selectedImageWidth/3, selectedImageHeight/3) 

    for (var colI = 0; colI < 3; colI++) 
    { 
     for (var rowI = 0; rowI < 3; rowI += 1) 
     { 
      let tileRect = CGRectMake(CGFloat(rowI) * tileSize.width, tileSize.height * CGFloat(colI), tileSize.width, tileSize.height) 

      if let selectedImage = displayImageView.image 
      { 
       let tileImage = CGImageCreateWithImageInRect(selectedImage.CGImage, tileRect) 
       let aUItile = UIImage(CGImage: tileImage!) 
       tileImageStack.append(aUItile) 
      } 
     } 
    } 

    //Display tiles in order on screen, then mix them up randomly 

    let frameWidth = self.view.frame.width 
    let frameHeight = self.view.frame.height 

    var xCen = (frameWidth/3)/2 
    var yCen = (frameHeight/3)/2 

    var pieceNumber = 0 

    for (var v = 0; v < 3; v += 1) 
    { 
     for (var h = 0; h < 3; h += 1) 
     { 
      let tiledView = UIImageView(frame:CGRectMake(0, 0, frameWidth/3, (frameHeight)/3)) 
      var curCenter = CGPointMake(xCen, yCen) 
      allCenters.append(NSValue(CGPoint: curCenter)) 
      //tiledView.backgroundColor = UIColor.redColor() 
      tiledView.center = curCenter 
      tiledView.image = tileImageStack[pieceNumber] as? UIImage 
      tiledView.userInteractionEnabled = true 
      tiledViewsStack.append(tiledView) 
      self.view.addSubview(tiledView) 
      xCen += (frameWidth/3) 
      pieceNumber += 1 
     } 
     xCen = (frameWidth/3)/2 
     yCen += (frameHeight/3) 
    } 

    tiledViewsStack[0].removeFromSuperview() 
    tiledViewsStack.removeAtIndex(0) 
    //Now there are 8 imageViews in the tiledViewsStack array, and 9 centers stored in allCenters array.   

    var centersCopy = allCenters 
    var randLocInt = Int() 
    var randLoc = CGPoint() 

    for any in tiledViewsStack 
    { 
     randLocInt = Int(arc4random() % UInt32(centersCopy.count)) // 0, --- 8 
     randLoc = centersCopy[randLocInt].CGPointValue() 
     any.center = randLoc 
     centersCopy.removeAtIndex(randLocInt) 
    }  
    emptySpot = centersCopy[0].CGPointValue() 
} 

var tapCen = CGPoint(); 

var left = CGPoint(); 
var right = CGPoint(); 
var top = CGPoint(); 
var bottom = CGPoint(); 

var leftIsEmpty = false 
var rightIsEmpty = false 
var topIsEmpty = false 
var bottomIsEmpty = false 


override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) 
{ 
    let frameWidth = self.view.frame.width 
    let frameHeight = self.view.frame.height 

    let allTouches = event?.allTouches() 
    let myTouch = allTouches?.first 

    if myTouch!.view != self.view 
    { 
     tapCen = myTouch!.view!.center 

     left = CGPointMake(tapCen.x - (frameWidth/3), tapCen.y) 
     right = CGPointMake(tapCen.x + (frameWidth/3), tapCen.y) 
     top = CGPointMake(tapCen.x, tapCen.y - (frameHeight/3)) 
     bottom = CGPointMake(tapCen.x, tapCen.y + (frameHeight/3)) 

     if (emptySpot == left) {leftIsEmpty = true} 
     if (emptySpot == right) {rightIsEmpty = true} 
     if (emptySpot == top) {topIsEmpty = true} 
     if (emptySpot == bottom) {bottomIsEmpty = true} 

     if (leftIsEmpty || rightIsEmpty || topIsEmpty || bottomIsEmpty) 
     { 
      //UIView.animateWithDuration(0.5, animations: myTouch!.view!.center = emptySpot, completion: true) 

      UIView.animateWithDuration(0.5, delay: 0, options: UIViewAnimationOptions.TransitionNone, animations: {() -> Void in 

       myTouch!.view!.center = emptySpot 

       }, completion: { (finished: Bool) -> Void in 
       }) 

      emptySpot = tapCen 
      leftIsEmpty = false; rightIsEmpty = false; topIsEmpty = false; bottomIsEmpty = false; 
     } 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} } 

答えて

1

あなたが使用している場合ビューの中心またはフレームを自動レイアウトすると、制約がビューの位置をオーバーライドするため、期待通りに動作しないことがあります。

(何かが更新されるビューのレイアウトを起こすまで、それは動作します。その時点での制約は、あなたが行った変更を上書きします。)

あなたの制約にコンセントを追加する必要があり、自動レイアウトでは、(あなたのビューを移動するためにそれらの制約の定数値を変更します。

あなたのコードでは、> 4個のスペースでインデントすることは、テキストブロックをコードとしてマークするものです。最初の数行は十分にインデントされていませんでした。 (私はそれを修正しました)

BTW。あなたのコードにブロック引用符を使用する理由はありません。コードを選択し、エディタの中括弧コードボタンをクリックすると、コードに必要な4つのスペースがインデントされます。

(私はおそらくそれを行う必要があります。あなたのコードの行にすべての不要な「>」ブロック引用プレフィックスを削除するのが面倒だった。)フォーマットのヒント

+0

ありがとう! 私は9つのパズルタイルUIImageViewsのいずれかを作成するために自動レイアウトを使用しません - 私は2番目のネストされたforループでプログラムで行います。一番上のナビゲーションコントローラバーには何か関係がありますか? また興味があります:シミュレータでこれを実行してテストできましたか? –

+0

View Controllerを保持しているStoryboard/XIBに「Use AutoLayout」チェックボックスがオンになっていますか? ** **はデフォルトでチェックされていますので、あなたがそれをオフにすることを覚えていない限り、答えは非常に可能性が高いです。 –

+0

はい、チェックされました。私はすべてのシーン/ビューコントローラのチェックを外しましたが、それは修正されませんでした。 –

関連する問題