有没有办法隐藏 Apple Watch 中的默认 activity 指示器?
Is there a way to hide default activity indicator in apple watch?
在我实现自定义 activity 指标的应用程序中,默认情况下 Apple Watch 有 activity 指标,我不想显示我该如何实现?因为默认 activity 指示器正好位于屏幕中央,但自定义 activity 指示器稍微向下。第一个是默认图像,第二个是自定义图像。
有没有办法提供自定义框架或隐藏默认 activity 指标?
!
不幸的是没有。不存在这样的 API。这一切都由 OS 控制。
SwiftUI
import SwiftUI
struct ActivityIndicatorView: View {
// MARK: - Value
// MARK: Public
@Binding var isAnimating: Bool
// MARK: Private
private let radius: CGFloat = 10.0
private let count = 6
private let interval: TimeInterval = 0.15
private let minimumOpacity: Double = 0.25
@State private var opacity: Double = 0
private let point = { (index: Int, count: Int, radius: CGFloat, frame: CGRect) -> CGPoint in
let angle = 2.0 * .pi / Double(count) * Double(index)
let circleX = radius * cos(CGFloat(angle))
let circleY = radius * sin(CGFloat(angle))
return CGPoint(x: circleX + frame.midX, y: circleY + frame.midY)
}
private let timer = Timer.publish(every: 6 * 0.15, on: .main, in: .common).autoconnect() // every = count * interval
// MARK: - View
var body: some View {
GeometryReader { geometry in
ForEach(0..<self.count) { index in
Circle()
.fill(Color.white)
.frame(width: 9.0, height: 9.0)
.animation(nil)
.opacity(self.opacity <= 0 ? 1.0 * Double(index == 0 ? 6 : index) / Double(self.count) : self.opacity)
.position(self.point(index, self.count, self.radius, geometry.frame(in: .local)))
.animation(
Animation.easeOut(duration: self.minimumOpacity < self.opacity ? 0.3 : 0.4)
.repeatCount(1, autoreverses: true)
.delay(TimeInterval(index) * self.interval)
)
}
.onReceive(self.timer) { output in
self.update()
}
}
.rotationEffect(.degrees(30))
.opacity(isAnimating == false ? 0 : 1.0)
.onAppear {
self.update()
}
}
// MARK: - Function
// MARK: Private
private func update() {
opacity = minimumOpacity < opacity ? minimumOpacity : 1.0
DispatchQueue.main.asyncAfter(deadline: .now() + 0.38) {
self.opacity = self.minimumOpacity
}
}
}
#if DEBUG
struct ActivityIndicatorView_Previews: PreviewProvider {
static var previews: some View {
let view = ActivityIndicatorView(isAnimating: .constant(true))
return Group {
view
.previewDevice("Apple Watch Series 5 - 44mm")
view
.previewDevice("Apple Watch Series 4 - 40mm")
view
.previewDevice("Apple Watch Series 3 - 42mm")
view
.previewDevice("Apple Watch Series 3 - 38mm")
}
}
}
#endif
在我实现自定义 activity 指标的应用程序中,默认情况下 Apple Watch 有 activity 指标,我不想显示我该如何实现?因为默认 activity 指示器正好位于屏幕中央,但自定义 activity 指示器稍微向下。第一个是默认图像,第二个是自定义图像。
有没有办法提供自定义框架或隐藏默认 activity 指标?
不幸的是没有。不存在这样的 API。这一切都由 OS 控制。
SwiftUI
import SwiftUI
struct ActivityIndicatorView: View {
// MARK: - Value
// MARK: Public
@Binding var isAnimating: Bool
// MARK: Private
private let radius: CGFloat = 10.0
private let count = 6
private let interval: TimeInterval = 0.15
private let minimumOpacity: Double = 0.25
@State private var opacity: Double = 0
private let point = { (index: Int, count: Int, radius: CGFloat, frame: CGRect) -> CGPoint in
let angle = 2.0 * .pi / Double(count) * Double(index)
let circleX = radius * cos(CGFloat(angle))
let circleY = radius * sin(CGFloat(angle))
return CGPoint(x: circleX + frame.midX, y: circleY + frame.midY)
}
private let timer = Timer.publish(every: 6 * 0.15, on: .main, in: .common).autoconnect() // every = count * interval
// MARK: - View
var body: some View {
GeometryReader { geometry in
ForEach(0..<self.count) { index in
Circle()
.fill(Color.white)
.frame(width: 9.0, height: 9.0)
.animation(nil)
.opacity(self.opacity <= 0 ? 1.0 * Double(index == 0 ? 6 : index) / Double(self.count) : self.opacity)
.position(self.point(index, self.count, self.radius, geometry.frame(in: .local)))
.animation(
Animation.easeOut(duration: self.minimumOpacity < self.opacity ? 0.3 : 0.4)
.repeatCount(1, autoreverses: true)
.delay(TimeInterval(index) * self.interval)
)
}
.onReceive(self.timer) { output in
self.update()
}
}
.rotationEffect(.degrees(30))
.opacity(isAnimating == false ? 0 : 1.0)
.onAppear {
self.update()
}
}
// MARK: - Function
// MARK: Private
private func update() {
opacity = minimumOpacity < opacity ? minimumOpacity : 1.0
DispatchQueue.main.asyncAfter(deadline: .now() + 0.38) {
self.opacity = self.minimumOpacity
}
}
}
#if DEBUG
struct ActivityIndicatorView_Previews: PreviewProvider {
static var previews: some View {
let view = ActivityIndicatorView(isAnimating: .constant(true))
return Group {
view
.previewDevice("Apple Watch Series 5 - 44mm")
view
.previewDevice("Apple Watch Series 4 - 40mm")
view
.previewDevice("Apple Watch Series 3 - 42mm")
view
.previewDevice("Apple Watch Series 3 - 38mm")
}
}
}
#endif