我在故事板中创建了一个UIView,并且我链接到一个名为" XXX"的自定义UIView类。在drawRect中我已经编写了代码来填充XXX中的颜色。从我的视图控制器我试图动画UIView。 XXX(UIView)中的填充颜色正在发生,但没有动画。这是我的代码。
class XXX: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
}
override func drawRect(rect: CGRect) {
var context: CGContextRef = UIGraphicsGetCurrentContext()!
CGContextClearRect(context, rect)
let color = UIColor.greenColor().CGColor
CGContextSetFillColorWithColor(context, color)
CGContextAddRect(context, rect)
CGContextFillPath(context)
}
myviewcontroller.swift
@IBOutlet var xxxView: XXX!
override func viewDidLoad() {
super.viewDidLoad()
XXX.animateWithDuration(1.0, delay: 0, options:
UIViewAnimationOptions.Repeat, animations: { () -> Void in
XXX.setAnimationDuration(1.0)
self.xxxView = XXX (frame: CGRectMake(0, 0, 100, 100))
},completion: nil);
}
我在视图控制器动画中出错的地方。无法弄明白。那么,如何动画自定义UIView?或如何为drawrect的内容设置动画?
注意:调用了drawRect,并且rect填充了颜色但没有动画。 我之前的方法是在控制器中创建一个UIView,并通过动画增加宽度。但是,它没有被团队接受。像下面这样的东西,工作正常。
var xxxView = UIView()
xxxView.frame = CGRectMake(0, 10, startingPoint, 20)
xxxView.backgroundColor = UIColor.greenColor()
UIView.animateWithDuration(1.0, delay: 0, options:
UIViewAnimationOptions.Repeat, animations: { () -> Void in
UIView.setAnimationDuration(3.0)
let totalWidth: CGFloat = 50
let animationWidth: CGFloat = totalWidth - startingPoint
var frame : CGRect = xxxView.frame;
frame.size.width = (startingPoint + animationWidth)
xxxView.frame = frame;
},completion: nil);
谢谢!
答案 0 :(得分:1)
<强>更新强> 我现在看到你在问什么,我起初误会了。你想要动画填充UIView而不实际制作视图动画(不知道为什么)。
在drawRect内部而不是使用提供的rect变量,使用自定义&#34; currentHeight&#34;创建自己的。变量值为0,然后增加你的&#34; currentHeight&#34;使用动画块或计时器变量直到它已满。
您可以使用CADisplayLink调用函数来调用&#34; setNeedsDisplay&#34;为了触发重绘作为动画,自定义变量不会触发对绘图的更新(尽管也许你可以动画另一个变量来触发它,它很邋but但可能有用)。
很抱歉,我无法提供更好的解释或示例,但我现在远离笔记本电脑。
问题是你在动画块内部创建了一个xxxView的全新实例,而不是为现有动画块设置动画。
如果您希望视图设置动画,则需要将动画块之外的现有self.xxxView(使用故事板或代码)初始化到起点和动画块内部,调整其想要设置动画的值。例如:
override func viewDidLoad() {
super.viewDidLoad()
self.xxxView = XXX(frame:CGRectMake(0,0,100,100) //set starting point here or set it in storyboard
XXX.animateWithDuration(1.0, delay: 0, options:
UIViewAnimationOptions.Repeat, animations: { () -> Void in
XXX.setAnimationDuration(1.0)
self.xxxView.alpha = 1
},completion: nil);
}
此代码将初始化一个alpha为0的视图,然后将其设置为1的alpha值,持续时间为1秒。
如果您希望它看起来好像视图用颜色填充,您可以使用调整视图大小的技巧。这与在动画块中操纵现有视图属性的概念相同。
示例:
override func viewDidLoad() {
super.viewDidLoad()
self.xxxView = XXX(frame:CGRectMake(0,0,0,0) //set starting point here or set it in storyboard
self.xxxView.alpha = 0
XXX.animateWithDuration(1.0, delay: 0, options:
UIViewAnimationOptions.Repeat, animations: { () -> Void in
XXX.setAnimationDuration(1.0)
self.xxxView.frame = CGRectMake(0,0,100,100)
},completion: nil);
}
答案 1 :(得分:0)
我认为你的问题是当视图加载时,它已经加载了动画。当视图出现时,您希望它具有动画效果。尝试将其放在override func viewDidAppear()。
中答案 2 :(得分:0)
如果您只需要动画更改UIView的颜色,那么最简单的方法是使用backgroundColor
属性并在动画块中更改它,如下所示:
UIView.animateWithDuration(duration:1.0, animations:{ () -> Void in
myView.backgroundColor = UIColor.greenColor();
})
请记住,animateWithDuration
func是一个类func,所以你不要在UIView
的实例上调用它,而是在类本身上调用它。
就动画drawRect:
方法而言,这更复杂,我无法给出明确的答案。一种选择是使用CAAnimation
对象,并将其添加到视图的layer
中,用于属性backgroundColor
,如下所示:
var animation : CABasicAnimation = CABasicAnimation(keyPath:"backgroundColor")
animation.fromValue = myView.backgroundColor
animation.toValue = UIColor.greenColor
animation.duration = 1.0
myView.layer.backgroundColor = UIColor.greenColor.CGColor
myView.layer.addAnimation(animation, forKey:"backgroundColor")
注意:上面的代码未经测试,旨在提供一个不确定的想法。这也假设您想要从一种颜色到另一种颜色的漂亮淡入淡出动画。对于自定义动画,例如从上到下填充,您需要执行其他操作,例如添加子图层并对其大小进行动画处理。