Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Swift、iOS中制作可重新定位的3x3正方形?_Ios_Swift - Fatal编程技术网

如何在Swift、iOS中制作可重新定位的3x3正方形?

如何在Swift、iOS中制作可重新定位的3x3正方形?,ios,swift,Ios,Swift,我是Swift(和iOS编程)新手,遇到了一个问题: 我有一个3x3区域,每个单元都有UIImageView-s 这些必须是可移动的,所以在拖动它们时,它们必须移动到指定的位置。像这样: ┌──┬──┬──┐ │ 1│ 2│ 3│ ├──┼──┼──┤ │ 4│ 5│ 6│ ├──┼──┼──┤ │ 7│ 8│ 9│ └──┴──┴──┘ 将第一行拖动到右侧会产生以下结果: ┌──┬──┬──┐ │ 3│ 1│ 2│ 1,2,3 changed to 3,1,

我是Swift(和iOS编程)新手,遇到了一个问题:

我有一个3x3区域,每个单元都有UIImageView-s

这些必须是可移动的,所以在拖动它们时,它们必须移动到指定的位置。像这样:

┌──┬──┬──┐  
│ 1│ 2│ 3│  
├──┼──┼──┤  
│ 4│ 5│ 6│  
├──┼──┼──┤  
│ 7│ 8│ 9│  
└──┴──┴──┘  
将第一行拖动到右侧会产生以下结果:

┌──┬──┬──┐  
│ 3│ 1│ 2│  1,2,3 changed to 3,1,2
├──┼──┼──┤  
│ 4│ 5│ 6│  
├──┼──┼──┤  
│ 7│ 8│ 9│  
└──┴──┴──┘ 

如果没有动画,或者可能使用动画,我如何才能做到这一点?

UIAttachmentBehavior类可用于创建两个项目之间或项目与点之间的连接。您可以通过将视图附加到定位点,然后添加平移手势来识别屏幕上的拖动,同时将附加视图的定位点更新到用户拖动到的位置来使用它

您可以使用这些平移手势执行多种不同类型的平移/动画。这里有一个例子,你可以修改和编辑,以适合你的应用程序的手势

将平移手势识别器从对象库拖动到视图控制器,并通过将控件从识别器拖动到AttachViewController.swift文件,为手势识别器创建动作。将操作手柄命名为span,并将操作类型选择为uipangestrerecognizer,而不是AnyObject

它将包含类似于此示例的代码*请注意,正方形是通过编程方式创建的。但在您的情况下,您可以用UIView替换。当然,您可以随意命名ViewController类

你的应用程序没有使用重力,但它仍然在这里

import UIKit

class AttachViewController: UIViewController {

var squareView: UIView!
var anchorView: UIView!
var attachment: UIAttachmentBehavior!
var animator: UIDynamicAnimator!
var gravity: UIGravityBehavior!

@IBAction func handlePan(sender: UIPanGestureRecognizer) {

    attachment.anchorPoint = sender.locationInView(view)
    anchorView.center = sender.locationInView(view)

}

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    squareView = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
    squareView.backgroundColor = UIColor.blueColor()
    view.addSubview(squareView)

    anchorView = UIView(frame: CGRect(x: view.center.x, y: view.center.y, width: 20, height: 20))
    anchorView.backgroundColor = UIColor.redColor()
    view.addSubview(anchorView)

    attachment = UIAttachmentBehavior(item: squareView, attachedToAnchor: CGPointMake(anchorView.center.x, anchorView.center.y))

    animator = UIDynamicAnimator(referenceView: view)
    animator.addBehavior(attachment)

    gravity = UIGravityBehavior(items: [squareView])
    animator.addBehavior(gravity)

}

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

}

粗略地给出一个想法

var containerview = UIView() //set frame and color and stuff
var boxdata = [[UIImageView]]()

func viewdidload() {

    for index in 0..<3 {
        var row = [UIImageView]()
        for index in 0..<3 {
            println(index)
            var imageview = UIImageView() //set frame color image etc set so each iteration has a different frame..
            row.append(imageview)
            containerview.addSubview(imageview)
        }
        boxdata.append(row)
    }      
}

func swaplocations(first: UIImageView, second: UIImageView) {
 //swap frame of the 2 views and add animate with duration here

}
var containerview=UIView()//设置框架、颜色和内容
var-boxdata=[[UIImageView]]()
func viewdidload(){

对于0中的索引..发布您首先尝试的内容我并没有真正完成任何部分,只是一个带有这些数字的2d数组,另一个只是故事板