如何在Swift,iOS中制作可重新定位的3x3平方?

时间:2015-08-01 20:22:46

标签: 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,2
├──┼──┼──┤  
│ 4│ 5│ 6│  
├──┼──┼──┤  
│ 7│ 8│ 9│  
└──┴──┴──┘ 

如果没有或可能使用动画,我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

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

您可以使用这些平移手势来执行许多不同类型的平移/动画。这是一个示例,您可以更改和编辑以适合您的应用程序的手势。

将Pan Gesture Recognizer从Object库拖到视图控制器,并通过Control-dragger从识别器拖动到 AttachViewController.swift 文件,为手势识别器创建一个动作。将操作命名为handlePan,并选择操作类型为 UIPanGestureRecognizer ,而不是AnyObject。

它将包含与此示例类似的代码。 *注意,正方形是以编程方式创建的。但在你的情况下,你可以用你的UIViews代替。当然,无论你喜欢什么,都可以命名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.
}

}

答案 1 :(得分:2)

粗略地提出一个想法

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

}