- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
很抱歉给的是静态图片,而不是gif图片,所以无法显示问题。
但我在下面给出了演示的代码,因此您可以在 xcode
中进行测试。
import UIKit
class ViewController: UIViewController {
var circelWidth:CGFloat = 0.0
var circle_r_y:CGFloat = 316
let apear_circle_duration:CFTimeInterval = 1.5
let turn_ani_repeat_count:Float = 1 // times
let turn_ani_duration:Float = 0.4 // one circle, how many time, you can change the proerty to look more detail.
override func viewDidLoad() {
super.viewDidLoad()
initData()
initUI()
}
func initData() {
// 2.圆圈⭕️
if (Display.typeIsLike == .iphone6 || Display.typeIsLike == .iphone6plus) {
self.circelWidth = 260 // must set, then animate the circel
}else {
self.circelWidth = 230 // must set, then animate the circel
}
}
func initUI() {
self.view.backgroundColor = UIColor.brown
self.animateCircle()
}
func animateCircle() {
let r = CAReplicatorLayer()
r.bounds = CGRect.init(x: 0.0, y: 0.0, width: circelWidth, height: circelWidth)
r.cornerRadius = 10.0 // 10
r.backgroundColor = UIColor.clear.cgColor
// var circle_r_y:CGFloat = 160.0
circle_r_y = (UIScreen.main.bounds.size.height - 64) / 2.0 + 64
r.position = CGPoint.init(x: self.view.bounds.width / 2.0, y: circle_r_y)
//r.anchorPoint = CGPoint.init(x: 0.5, y: circle_r_y! / r.bounds.height) // 锚点设置
r.anchorPoint = CGPoint.init(x: 0.5, y: 0.5)
self.view.layer.addSublayer(r)
// dot
let dot = CALayer()
dot.bounds = CGRect(x:0.0, y :0.0, width:6.0, height:6.0)
dot.position = CGPoint(x:100.0, y:10.0)
dot.backgroundColor = UIColor(white:1, alpha:1.0).cgColor
dot.cornerRadius = 3.0 // half of dot width 一半
r.addSublayer(dot)
let nrDots: Int = 32
r.instanceCount = nrDots
let angle = CGFloat(2*M_PI) / CGFloat(nrDots)
r.instanceTransform = CATransform3DMakeRotation(angle, 0.1, 0.1, 1.0)
let shrink = CABasicAnimation(keyPath: "transform.scale")
shrink.fromValue = 1.0
shrink.toValue = 1.0 // 0.5
shrink.duration = apear_circle_duration
shrink.repeatCount = Float.infinity
dot.add(shrink, forKey: nil)
r.instanceDelay = apear_circle_duration/Double(nrDots)
dot.transform = CATransform3DMakeScale(0.1, 0.1, 0.1)
delay(delay: apear_circle_duration) {
let turn_key_path = "transform.rotation"
let turn_ani = CABasicAnimation.init(keyPath: turn_key_path)
turn_ani.isRemovedOnCompletion = false
turn_ani.fillMode = kCAFillModeForwards
turn_ani.toValue = M_PI*2
turn_ani.duration = CFTimeInterval(self.turn_ani_duration)
turn_ani.repeatCount = self.turn_ani_repeat_count
r.add(turn_ani, forKey: turn_key_path)
dot.transform = CATransform3DMakeScale(1, 1, 1) // 设置回来,不然再出现会放小
}
}
func delay(delay:Double, closure:@escaping ()->()){
let when = DispatchTime.now() + delay
DispatchQueue.main.asyncAfter(deadline: when, execute: closure)
}
}
Display.swift
,用于检查设备类型。
import UIKit
public enum DisplayType {
case unknown
case iphone4
case iphone5
case iphone6
case iphone6plus
static let iphone7 = iphone6
static let iphone7plus = iphone6plus
}
public final class Display {
class var width:CGFloat { return UIScreen.main.bounds.size.width }
class var height:CGFloat { return UIScreen.main.bounds.size.height }
class var maxLength:CGFloat { return max(width, height) }
class var minLength:CGFloat { return min(width, height) }
class var zoomed:Bool { return UIScreen.main.nativeScale >= UIScreen.main.scale }
class var retina:Bool { return UIScreen.main.scale >= 2.0 }
class var phone:Bool { return UIDevice.current.userInterfaceIdiom == .phone }
class var pad:Bool { return UIDevice.current.userInterfaceIdiom == .pad }
class var carplay:Bool { if #available(iOS 9.0, *) {
return UIDevice.current.userInterfaceIdiom == .carPlay
} else {
// Fallback on earlier versions
return false//UIDevice.current.userInterfaceIdiom == carplay
}
}
class var tv:Bool { if #available(iOS 9.0, *) {
return UIDevice.current.userInterfaceIdiom == .tv
} else {
// Fallback on earlier versions
return false
}
}
class var typeIsLike:DisplayType {
if phone && maxLength < 568 {
return .iphone4
}
else if phone && maxLength == 568 {
return .iphone5
}
else if phone && maxLength == 667 {
return .iphone6
}
else if phone && maxLength == 736 {
return .iphone6plus
}
return .unknown
}
}
问题
如果你在你的项目中测试这个,你会发现这个问题,当动画时,有一点偏移,这是一个奇怪的问题,因为,我确保 CAReplicatorLayer
的 ahchorPoint
是(0.5, 0.5)
,但是为什么会有偏移呢?
如果你想看更多细节,你可以改变turn_ani_duration:Float
的值,你可以看到偏移量。
最佳答案
可能为时已晚,但这是由您提供给旋转变换的向量引起的:代替 r.instanceTransform = CATransform3DMakeRotation(角度, 0.1, 0.1, 1.0)
经过 r.instanceTransform = CATransform3DMakeRotation(角度, 0, 0, 1.0)
没关系。
关于ios - 为什么我的CAReplicatorLayer旋转时会有偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41359646/
如何在 CAReplicatorLayer 层中引入随机性?例如,随机化每个粒子的位置。 最好的,万斯 最佳答案 您必须setInstanceTransform:(CATransform3D)tran
我有一个雪花图像,我想复制它并在屏幕上创建降雪。我们可以将 instanceCount 设置为 X 以创建大量雪花,我们可以设置 instanceTransform 以将每个实例与下一个实例保持一定距
我一直在尝试使用 CAReplicatorlayer、CATextLayer 和非常基本的动画来创建很酷的文本效果。我试图让这些字母看起来像是从屏幕顶部掉落的,然后是很酷的复制器,它们会变得越来越不可
我发现 CAReplicatorLayer 的有趣之处: 它能够非常有效地多次显示具有不同转换的 CALayer(怎么做?) 它似乎以某种方式重用了复制层的“后备存储”,甚至对其应用了一些颜色(如何?
我正在尝试使用复制器层来创建原始层的反射。问题是我想对每个实例应用不同的效果(光栅化副本,但保持原件完好无损)。这是否可能使用复制器层,如果不能,您能否建议实现此目的的方法? 注意:我尝试复制图层,但
我有一个 CAReplicatorLayer 按预期复制其子层,但我想关闭动画的内置持续时间。换句话说,我希望看到复制基础层的即时结果,而不是在 Apple 隐式指定的持续时间内。 这是复制代码,用
我需要为我的 CAReplicatorLayer 对象制作 50 像素的动画。 我实现了将 CAReplicatorLayer 帧更新为 50 像素,但我没有实现动画。 这是我的代码。 CATran
这个问题在这里已经有了答案: Is it possible to allow didSet to be called during initialization in Swift? (9 个回答)
是否可以使用具有一定随机性的 CAReplicatorLayer 粒子系统创建令人信服的 Spark 效果? 如果是,怎么做到的? 最佳答案 我认为新的 CAEmitterLayer 会更合适。 关于
我正在制作一个依赖于 CoreAnimation 的应用程序。它有一个 CAReplicatorLayer 和一个 CAShapeLayer 作为子层。当进行 12 次复制然后设置路径动画(在 tou
我是一名优秀的程序员,十分优秀!