我在9个相等空间的框架中有8个UIImageViews。触摸时,除两个视图(第一行)以外的所有视图均移至emptySpot。不知道为什么。

(作为一个旁注,我不知道为什么我的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.
} }

最佳答案

如果使用自动布局,则移动视图的中心或框架通常无法按预期进行,因为约束会覆盖视图的位置。

(它一直起作用,直到某些原因导致视图的布局被更新为止。这时,约束将覆盖您所做的更改。)

使用自动布局时,您需要将出口添加到约束中,然后更改这些约束上的常量值才能移动视图。

对于您的代码,缩进> 4个空格是将文本块标记为代码的原因。您的前几行缩进不够。 (我修好了它。)

顺便说一句。没有理由在代码上使用块引号。选择代码,单击编辑器上的花括号代码按钮,它将代码缩进4个空格。

(我懒得删除代码行上所有不需要的“>”块引号前缀。您应该这样做。)

10-08 07:29