Swift - 动画动态创建 UIImageView

Posted

技术标签:

【中文标题】Swift - 动画动态创建 UIImageView【英文标题】:Swift - Animate dynamically created UIImageView 【发布时间】:2015-09-22 22:23:12 【问题描述】:

最初,当我只是为我拥有的一个 UIImageView 设置动画时,我让这段代码工作。但后来我将其更改为对几个动态创建的 UIImageView 进行动画处理,但是由于它们是在 for 循环中动态创建的,因此我发现很难像最初那样为它们设置动画。

override func viewDidLoad() 
    super.viewDidLoad()

    var sprite: UIImage = UIImage(named: "sprites/areaLocatorSprite.png")!

    var locations:NSArray = animal[eventData]["locations"] as NSArray

    for var i = 0; i < locations.count; i++ 

        println(locations[i]["locationx"])
        var locationx = locations[i]["locationx"] as String
        var locationy = locations[i]["locationy"] as String

        let x = NSNumberFormatter().numberFromString(locationx)
        let y = NSNumberFormatter().numberFromString(locationy)
        let cgfloatx = CGFloat(x!)
        let cgfloaty = CGFloat(y!)

        var mapSprite: UIImageView
        mapSprite = UIImageView(image: sprite)

        mapSprite.frame = CGRectMake(cgfloatx,cgfloaty,10,10)
        townMap.addSubview(mapSprite)

        timer = NSTimer.scheduledTimerWithTimeInterval(0.35, target: self, selector: Selector("flash"), userInfo: nil, repeats: true)

    



func flash() 
    var mapSprite:UIImageView?

    if mapSprite?.alpha == 1 
        mapSprite?.alpha = 0
     else 
        mapSprite?.alpha = 1
    

这不起作用,因为 flash 函数中的 mapSprite 与 for 循环中的不同。如何引用 for 循环中的那个,然后对其进行动画处理?或者有比我目前正在做的更好的选择吗?

非常感谢!

编辑 使用 Xcode 6.2

【问题讨论】:

您是打算对淡入淡出进行动画处理,还是希望它突然闪烁开/关? @Paul.s 只想突然闪烁开/关 【参考方案1】:

您需要将视图存储到一个属性中,然后在每次触发计时器事件时枚举该属性

var sprites: [UIImageView]?

override func viewDidLoad() 
  super.viewDidLoad()

  var sprite = UIImage(named: "sprites/areaLocatorSprite.png")!

  var locations:NSArray = animal[eventData]["locations"] as NSArray

  self.sprites = map(locations) 
    var locationx = $0["locationx"] as String
    var locationy = $0["locationy"] as String

    let x = NSNumberFormatter().numberFromString(locationx)
    let y = NSNumberFormatter().numberFromString(locationy)
    let cgfloatx = CGFloat(x!)
    let cgfloaty = CGFloat(y!)

    var mapSprite = UIImageView(image: sprite)

    mapSprite.frame = CGRectMake(cgfloatx,cgfloaty,10,10)
    townMap.addSubview(mapSprite)

    return mapSprite
  

  timer = NSTimer.scheduledTimerWithTimeInterval(0.35, target: self, selector: Selector("flash"), userInfo: nil, repeats: true)


func flash() 
  if let sprites = self.sprites 
    for sprite in sprites 
      sprite.alpha = sprite.alpha == 0 ? 1 : 0
    
  

【讨论】:

我想我也应该提到我正在使用 Xcode 6.2 作为守卫是 Swift2 的新东西吗?因为我不得不在谷歌上搜索什么是警卫,然后又遇到了 for 语句的布局问题,再次假设 Swift2 有新的东西?此外,locations 变量是一个 NSArray 并且没有 map 成员;除非在 Swift2 中是这样吗?谢谢,非常感谢您的帮助! 再次为 Swift 1 更新 感谢更新,但这次我有两个错误,第一个是 '[UIImageView]?没有名为Generator'的成员,但替换后解决了?和 !第二个是'支撑语句块是一个未使用的闭包'和'expected after if condition swift',除非我这样做,但它不起作用 func flash() if let sprites = self.sprites else for精灵中的精灵 sprite.alpha = sprite.alpha == 0 ? 1 : 0 我一直在尝试自己修复它,但似乎我失败了。对不起,再次感谢! 我已经通过执行以下操作修复了它 - func flash() if let sprites = self.sprites for sprite in sprites sprite.alpha = sprite.alpha == 0 ? 1 : 0 else for sprite in sprites sprite.alpha = sprite.alpha == 0 ? 1 : 0 请将您的代码更新为此,或更好的版本,我会将其标记为正确答案:) 谢谢! 抱歉,当我从 Swift 2 转换为 Swift 1 时,该行中有一个剩余的 else(手机上编辑的危险)

以上是关于Swift - 动画动态创建 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 如何在没有第三方框架的情况下在 Swift 中创建自定义动画横幅

iOS 实现脉冲雷达以及动态增减元素 By Swift-感谢分享

Swift - 删除动画效果

swift3.0 图片放大缩小动画效果

swift--动画效果

(Swift)如何通过重新加载 UITableView 根据 UITextfield 输入(动画)显示/隐藏单元格?