gpt4 book ai didi

ios - 使用 drawrect 自定义 UIView 动画

转载 作者:可可西里 更新时间:2023-11-01 02:23:48 24 4
gpt4 key购买 nike

我在 Storyboard中创建了一个 UIView,并链接到一个名为“XXX”的自定义 UIView 类。在 drawRect 中,我编写了代码以在 XXX 中填充颜色。从我的 View Controller 中,我试图为 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);
}

有些地方我在我的 View Controller 动画中犯了错误。想不通。那么,如何为自定义 UIView 设置动画?或者如何为 drawrect 的内容设置动画?

注意:drawRect 被调用,矩形被颜色填充但没有动画。我之前的方法只是在 Controller 中创建一个 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);

谢谢!

最佳答案

更新 我现在明白你在问什么了,一开始我误解了。您想要对 UIView 的填充进行动画处理而不实际对 View 进行动画处理(不确定原因)。

在您的 drawRect 内部而不是使用提供的 rect 变量,使用值为 0 的自定义“currentHeight”变量创建您自己的变量,然后使用动画 block 或计时器增加“currentHeight”变量直到它已满.

您可以使用 CADisplayLink 调用一个函数来调用“setNeedsDisplay”以触发重绘,因为动画自定义变量不会触发绘图更新(尽管也许您可以动画另一个变量来触发它,但它很草率但可能有效)。

抱歉,我无法提供更好的解释或示例,但我现在不在笔记本电脑旁边。


问题是您在动画 block 中创建了一个全新的 xxxView 实例,而不是对现有实例进行动画处理。

如果您希望您的 View 具有动画效果,您需要在动画 block 外部(使用 Storyboard 或代码)将现有的 self.xxxView 初始化为起点,并在动画 block 内部调整您想要动画的值。例如:

 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 的 View ,然后将其动画设置为 alpha 为 1,持续时间为 1 秒。

如果你想让它看起来好像 View 被颜色填充了,你可以使用调整 View 大小的技巧。这与从动画 block 中操作现有 View 的属性的概念相同。

例子:

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);
}

关于ios - 使用 drawrect 自定义 UIView 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29018891/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com