button.setTitle 清空图像视图
button.setTitle blanks out image view
谁能告诉我为什么设置 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.
}
}
实际上,有一种更好的方法可以让 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
终于找到问题所在了。这不是由定时器引起的,定时器完全没问题。问题是由于设置按钮标题时调用 viewDidLayoutSubviews
引起的。您正在使用自动布局,并且正在使用按钮的固有内容大小,对吗?而且由于两个标题的长度不同,所以当你设置标题时,按钮的框架会发生变化,因此会重新布局,然后调用 viewDidLayoutSubviews
。并且您在 viewDidLayoutSubviews
内设置 imageView
的中心值,所以基本上当您设置标题时,图像将向左移动 400 点到我猜它在屏幕外的原始位置。请注意:如果图像有不同的大小,当您调用 imageView.image = UIImage(named: "image.png")
时也会调用 viewDidLayoutSubviews
。我认为您使用的所有图像都具有相同的大小,这就是为什么当计时器运行时 viewDidLayoutSubviews
没有被调用。这是一个很好的 answer ,它解释了 viewDidLayoutSubviews
何时被调用。我会让你自己想出合适的解决办法,好吗? :)
谁能告诉我为什么设置 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.
}
}
实际上,有一种更好的方法可以让 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
终于找到问题所在了。这不是由定时器引起的,定时器完全没问题。问题是由于设置按钮标题时调用 viewDidLayoutSubviews
引起的。您正在使用自动布局,并且正在使用按钮的固有内容大小,对吗?而且由于两个标题的长度不同,所以当你设置标题时,按钮的框架会发生变化,因此会重新布局,然后调用 viewDidLayoutSubviews
。并且您在 viewDidLayoutSubviews
内设置 imageView
的中心值,所以基本上当您设置标题时,图像将向左移动 400 点到我猜它在屏幕外的原始位置。请注意:如果图像有不同的大小,当您调用 imageView.image = UIImage(named: "image.png")
时也会调用 viewDidLayoutSubviews
。我认为您使用的所有图像都具有相同的大小,这就是为什么当计时器运行时 viewDidLayoutSubviews
没有被调用。这是一个很好的 answer ,它解释了 viewDidLayoutSubviews
何时被调用。我会让你自己想出合适的解决办法,好吗? :)