ios - 如何同时对多个对象应用动态行为

标签 ios arrays swift loops dynamic

我正在尝试对刚刚从数组创建的 Label 对象使用 DynamicBehaviors。为此,我使用“For In”循环。所有对象都按预期创建,但只有最后一个对象是动态的。

也许我应该使用 UIDynamicItemGroup,但经过多次尝试,我仍然不知道如何使用它。

您可能想知道,我是面向对象编程的新手,所以我希望这不会浪费您的时间。

下面是我实际拥有的代码。

提前致谢。

import UIKit

class ViewController: UIViewController {



    var tests:[String] = ["test1","test2","test3","test4","test5","test6","test7","test8","test9","test10","test11"]
    var viewLabelArray:UIView!


    var label:UILabel!
    var color:UIColor!
    var animator:UIDynamicAnimator!


    var dynamicBehavior:UIDynamicBehavior!
    var collisionBehavior:UICollisionBehavior!
    var countLabel = 0


    override func viewDidLoad() {
        super.viewDidLoad()

        let size:CGFloat = 50.0
        var positionX:CGFloat = 60.0
        var positionY:CGFloat = 100.0


        for test in tests {
            label = UILabel(frame:CGRect(x: positionX, y: positionY, width: size, height: size))
            label.center = CGPoint(x: positionX, y: positionY)
            label.layer.cornerRadius = size * 0.5
            label.layer.masksToBounds = true
            label.backgroundColor = color
            label.textAlignment = .center
            label.textColor = UIColor.white
            label.adjustsFontSizeToFitWidth = true
            label.numberOfLines = 1
            label.text = test
            self.view.addSubview(label)

            countLabel = countLabel + 1

            if countLabel == 4 || countLabel == 8 {
                positionX = positionX - 140
                positionY = positionY + 100
            } else {
                positionX = positionX + 60
            }

            let gravity = UIGravityBehavior(items: [label])
            let direction = CGVector(dx: 0.0, dy: 1.0)
            gravity.gravityDirection = direction


            let bounce = UIDynamicItemBehavior(items: [label])
            bounce.elasticity = 1

            let boundries = UICollisionBehavior(items: [label])
            boundries.translatesReferenceBoundsIntoBoundary = true

            animator = UIDynamicAnimator(referenceView: self.view)


            animator.addBehavior(bounce)
            animator.addBehavior(boundries)
            animator.addBehavior(gravity)


        }
    }

}

最佳答案

我修改了您的一些代码行,它非常适合我。

感谢Alexander Momchliov

var animatorArray = [UIDynamicAnimator]()

for (i,test) in tests.enumerated() {
    //code
    let bounce = UIDynamicItemBehavior(items: [label])
    bounce.elasticity = 1

    let boundries = UICollisionBehavior(items: [label])
    boundries.translatesReferenceBoundsIntoBoundary = true

    animatorArray.append(UIDynamicAnimator(referenceView: self.view))
    animatorArray[i].addBehavior(gravity)
    animatorArray[i].addBehavior(bounce)
    animatorArray[i].addBehavior(boundries)
}

截图:

enter image description here

关于ios - 如何同时对多个对象应用动态行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40581923/

相关文章:

java - 将文本文件中的输入读取到数组列表中

java - 如何将方法从 Array 转移到 ArrayList

php - 如果多维数组中的键值对匹配,如何合并两个具有平均值的数组

ios - 触摸一次后如何使 UIButton 不可点击并隐藏和取消隐藏按钮? - swift

ios - 警告 : Attempt to present <UIAlertController: 0x7facd3946920> on <. ..> 已经呈现(空)

ios - CoreBluetooth XPC 连接在关闭 View Controller 时无效

ios - 无限滚动 3d map

ios - 为什么即使我将约束设置为 0,UITableView 上仍然有余量

ios - 在 Swift 中作为整数的索引

swift - 如何快速打开 URL 并在 Safari 中发布数据