button.setTitle消隐图像视图

时间:2015-05-27 22:48:30

标签: ios swift uiview uiimage

有谁能告诉我为什么设置button.setTitle(string,forState)函数会使UIImage空白?

如果我注释掉使用button.setTitle的两行,动画运行正常。当线条在那里时,按下按钮时动画消失。

var cryButton:UIButton和函数UpdateImage引用相同的按钮,但我尝试添加第二个按钮并在其中引用标题,它具有相同的效果。它消隐了图像。

我很难过:)

import UIKit

class ViewController: UIViewController {

    var counter = 1

    var numImages = 8

    var toggle = true

    var timer = NSTimer()


    @IBOutlet weak var babyImage: UIImageView!

    @IBOutlet weak var cryButton: UIButton!

    @IBAction func UpdateImage(sender: AnyObject) {

        if toggle == true {
            timer = NSTimer.scheduledTimerWithTimeInterval(0.2, target: self, selector: Selector("doanimation"), userInfo: nil, repeats: true)
            cryButton.setTitle("Stop crying", forState: UIControlState.Normal)
            toggle = false

        } else {
            timer.invalidate()
            babyImage.image = UIImage(named: "WaWa1.png")
            cryButton.setTitle("Wa-Waaaaa!", forState: UIControlState.Normal)
            toggle = true
        }

    }

    func doanimation() {

        babyImage.image = UIImage(named: "WaWa\(counter).png")

        if (counter == (numImages)) {
            counter = 1
        } else {
            ++counter
        }
    }


    override func viewDidLayoutSubviews() {
        babyImage.center = CGPointMake(babyImage.center.x - 400, babyImage.center.y)
    }

    override func viewDidAppear(animated: Bool) {
        UIView.animateWithDuration(2, animations: { () -> Void in
            self.babyImage.center = CGPointMake(self.babyImage.center.x + 400, self.babyImage.center.y)
        })

    }


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

    }

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

}

2 个答案:

答案 0 :(得分:0)

实际上有一种更好的方法可以使用图像数组为UIImageView设置动画,你可以试试这个并删除计时器。

babyImage.animationImages = @[image1,image2,image3,image4,image5,image6,image7,image8]
babyImage.animationDuration = 1.6 
// There are 8 images, so each image occupies 1.6 / 8 = 0.2 secs    
babyImage.startAnimating()
// Use babyImage.stopAnimating() to stop the animation

答案 1 :(得分:0)

我终于找到了问题。它不是由定时器引起的,定时器完全没问题。问题是由设置按钮标题时调用viewDidLayoutSubviews引起的。您正在使用自动布局,并且您正在使用按钮的内在内容大小,对吗?由于两个标题的长度不同,因此当您设置标题时,按钮的框架将会更改,因此它将再次布局,然后将调用viewDidLayoutSubviews。并且你在imageView内设置了viewDidLayoutSubviews的中心值,所以基本上当你设置标题时,图像会将400点左移到原来的位置,我猜这是不在屏幕上。请注意:如果图片尺寸不同,拨打imageView.image = UIImage(named: "image.png")时也会拨打viewDidLayoutSubviews。我认为您使用的所有图像都具有相同的大小,这就是为什么没有调用计时器运行viewDidLayoutSubviews的原因。这是一个很好的answer,它解释了viewDidLayoutSubviews何时被调用。我会让自己找出合适的解决方案,好吗? :)