我的iOS应用程序中有3个UI元素,我想在动画时将其视为单个实体.
UIImageView顶部有UILabelView和UIActivityIndicatorView.有没有办法将这些东西组合在一起并为组织设置动画而不必独立地为每个组织制作动画?
在Mac OS 10.8上,我在我的应用程序中收到以下警告:
CoreAnimation: warning, deleted thread with uncommitted CATransaction;
它建议在环境中打开CA_DEBUG_TRANSACTIONS = 1来记录回溯,我这样做了.
这是我的回溯的顶部:
0 QuartzCore 0x00007fff88a84b95 _ZN2CA11Transaction4pushEv + 219 1 QuartzCore 0x00007fff88a8476d _ZN2CA11Transaction15ensure_implicitEv + 273 2 QuartzCore 0x00007fff88a8bb6a _ZN2CA5Layer12begin_changeEPNS_11TransactionEjRP11objc_object + 44 3 QuartzCore 0x00007fff88a8cb4e _ZN2CA5Layer10set_boundsERKNS_4RectEb + 452 4 QuartzCore 0x00007fff88a8c908 -[CALayer setBounds:] + 189
有谁知道这个警告是什么,以及如何避免它?
我想将一个视图从一个位置动态移动到一个新的位置.如果更新视图的图层位置,我认为视图将动画移动到新位置,implicit animation我猜,但是没有动画,为什么?
- (IBAction)startAnimation:(id)sender {
CGPoint position = self.imageView.layer.position;
position.y += 90;
self.imageView.layer.position = position;
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个有点复杂的动画,分两步进行:
UIViews将不需要可见的不透明度更改为 0 ,并将 a UIImageView(具有alpha = 1)移动到另一个CGPoint(位置)。UIView不透明度更改为0,然后在这一步的动画完成后,从superview中删除。UIImageViewUIImageView我是这样做的:
第一步是在没有显式 CATransaction 的情况下完成的。这两个动画刚刚beginTime设置为CACurrentMediaTime()。我在layer.addAnimation(...)通话后立即对视图进行更改。这里一切正常。
在第二步CATransaction.begin()实施中,我在开始时调用。在内部begin/commit调用中,CATransaction我创建并添加 2CABasicAnimations到 2 个不同的层:一层用于将不透明度从 0 更改为 1(对于UIView),一层用于将不透明度从 1 更改为 0(对于UIImageView)。两个动画都beginTime设置为CACurrentMediaTime() + durationOfThePreviousStep。
在CATransaction.begin()我调用CATransaction.setCompletionBlock({...}), 并在此完成块中,我对这两个视图应用更改:设置它们的新 alpha 并UIImageView从超级视图中删除。
问题是,在整个动画结束时,UIViewalpha 动画为 1 闪烁,这意味着它的 alpha 设置回 0(尽管我在完成块中将其 alpha …
我有一个自定义的CALayer,它绘制径向渐变。除动画期间外,它的效果都很好。似乎每次的迭代CABasicAnimation都会创建CALayer具有空默认属性值的子类的新副本:
在上面的屏幕截图中,您看到CABasicAnimation已创建了该图层的新副本并正在更新,gradientOrigin但没有其他属性可以进行。
结果是在动画期间不渲染任何内容。这是GIF:
这是应该是什么样的:
这是动画代码:
let animation = CABasicAnimation(keyPath: "gradientOrigin")
animation.duration = 2
animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
let newOrigin: CGPoint = CGPoint(x: 0, y: triangle.bounds.height/2)
animation.fromValue = NSValue(CGPoint: triangle.gradientLayer.gradientOrigin)
animation.toValue = NSValue(CGPoint: newOrigin)
triangle.gradientLayer.gradientOrigin = newOrigin
triangle.gradientLayer.addAnimation(animation, forKey: nil)
Run Code Online (Sandbox Code Playgroud)
这是自定义CALayer代码:
enum RadialGradientLayerProperties: String {
case gradientOrigin
case gradientRadius
case colors
case locations
}
class RadialGradientLayer: CALayer {
var gradientOrigin = CGPoint() {
didSet { setNeedsDisplay() }
}
var gradientRadius = CGFloat() { …Run Code Online (Sandbox Code Playgroud) core-animation radial-gradients calayer cabasicanimation swift
我有一个CAEmitterLayer实例,我想暂停然后多次恢复。
我找到了使用两个CAEmitterLayer扩展函数执行此操作的各种方法:
public func pause() {
speed = 0.0 // Freeze existing cells.
timeOffset = convertTime(CACurrentMediaTime(), from: self)
lifetime = 0.0 // Stop creating new cells.
}
Run Code Online (Sandbox Code Playgroud)
和
public func resume() {
speed = 1.0
beginTime = convertTime(CACurrentMediaTime(), from: self) - timeOffset
timeOffset = 0.0
lifetime = 1.0
}
Run Code Online (Sandbox Code Playgroud)
第一次使用emitterLayer.pause(),emitterLayer.resume()效果很好。
但是,从第二次开始,每当我使用时emitterLayer.pause(),emitterCells时间都会稍微向前跳跃。
请问有人可以帮我解决这个跳跃问题吗?
我正在尝试对图层的背景颜色从红色到蓝色进行简单的 CABasicAnimation。
添加动画并设置模型层的最终值后,动画闪烁为蓝色,然后再次变为红色,动画变为蓝色。
我的代码是:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// Create red layer and add to view
let redLayer = CALayer()
redLayer.backgroundColor = UIColor.red.cgColor
redLayer.position = view.center
redLayer.bounds.size = CGSize(width: 100, height: 100)
view.layer.addSublayer(redLayer)
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) {
// After a 1 second delay, animate from red to blue.
let anim = CABasicAnimation(keyPath: "backgroundColor")
anim.duration = 3
anim.fromValue = redLayer.backgroundColor
anim.toValue = UIColor.blue.cgColor
redLayer.add(anim, forKey: "")
// Set background color to final value
redLayer.backgroundColor = UIColor.blue.cgColor
} …Run Code Online (Sandbox Code Playgroud) 我正在为一个应用程序制作一些自定义类型的加载程序,我只需在我的视图中制作 4 个圆形层,并且所有设置和显示都很好。但是当我对所有图层应用脉冲动画缩放时,它们会扰乱我的所有设计和图层缩放,但它改变了它的中心点。我希望所有圆形图层首先缩放图层并缩小其尺寸并使其变大,然后再次进行同一性,它应该称为无穷大。但不应该改变它的中心点。
这是我分享我的代码
class ViewController: BaseViewController{
@IBOutlet weak var layerView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
drawCircles()
}
func drawCircles(){
let width = layerView.bounds.width
let halfOfView = width / 2
let firstCirleLayer = UIBezierPath(arcCenter: CGPoint(x: halfOfView / 2, y: halfOfView), radius: halfOfView / 3.5, startAngle: 0, endAngle: 2 * .pi, clockwise: true)
circleLayers(path: firstCirleLayer.cgPath, color: UIColor.purple)
let secondCirleLayer = UIBezierPath(arcCenter: CGPoint(x: halfOfView, y: halfOfView / 2), radius: halfOfView / 3.5, startAngle: 0, endAngle: 2 * .pi, clockwise: true)
circleLayers(path: …Run Code Online (Sandbox Code Playgroud) core-animation cabasicanimation cashapelayer swift ios-animations
我在CATransaction中设置了一些CALayer变换和边界修改.但是,无论我使用的方法(键值,setAnimationDuration)都没有动画,更改已完成,但立即没有过渡.你知道为什么吗?谢谢!
/* CALayer*layer=[CALayer layer];
layer.bounds =AnUIImageView.bounds;
layer.contents=AnUIImageView.layer.contents;
[AnotherUIImageView.layer addSublayer:layer];
CGPoint thecentre=AnUIImageView.center;
CALayer* layerInTarget=[AnotherUIImageView.layer.sublayers lastObject];
[layerInTarget setPosition:[self.view convertPoint:thecentre toView:AnotherUIImageView]];
AnUIImageView.layer.hidden=YES;
Run Code Online (Sandbox Code Playgroud)
*///上面的代码有效,我表明它是完整的
[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:2.0f]
forKey:kCATransactionAnimationDuration];
layerInTarget.position=[self.view convertPoint:AnotherUIImageView.center toView:AnotherUIImageView];
layerInTarget.transform=CATransform3DMakeScale(0.6,0.6,0.6);
[CATransaction commit];
Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个项目,我们正在实现一些Core Animation来调整大小/移动元素.我们已经注意到在许多Mac上,帧速率在这些动画中显着下降,尽管它们相当简单.这是一个例子:
// Set some additional attributes for the animation.
[theAnim setDuration:0.25]; // Time
[theAnim setFrameRate:0.0];
[theAnim setAnimationCurve:NSAnimationEaseInOut];
// Run the animation.
[theAnim startAnimation];
[self performSelector:@selector(endAnimation) withObject:self afterDelay:0.25];
Run Code Online (Sandbox Code Playgroud)
明确说明帧速率(比如60.0,而不是将其保留为0.0)会在线程等上放置更多优先级,因此可能提高帧速率?有没有更好的方法来完全动画这些?
core-animation ×10
ios ×6
objective-c ×4
swift ×3
calayer ×2
cocoa ×2
macos ×2
cashapelayer ×1
uiview ×1
xcode ×1