小编leo*_*oe1的帖子

Spring() 动画完成后 SwiftUI 执行操作

我试图弄清楚如何检测 SwiftUI 中的动画是否已完成,具体来说:Spring() 动画。我的第一个想法是使用 GeometryReader 来检测下面示例中的 Circle 何时到达原点(偏移量 = .0),但是这种方法有一个警告:Spring() 动画稍微超出了该点它应该在哪里结束然后反弹回来。所以“动画结束”会在动画结束之前被触发。

我做了一些研究,发现了另一种方法:SwiftUI withAnimation 完成回调。然而,在此解决方案中,动画对象的偏移量与原点进行比较,因此与上述问题相同。

我可以使用计时器,但这不是一个优雅的解决方案,因为 Spring() 动画的持续时间会根据其开始位置动态变化,所以这不是方法。

在下面的示例中,我希望动画完成后圆圈变为绿色。

有办法解决这个问题吗?感谢您的帮助!

在此输入图像描述

struct ContentView: View {
    
    @State var offset: CGSize = .zero
    @State var animationRunning = false
    
    var body: some View {
        
        VStack {
            Circle()
                .foregroundColor(self.animationRunning ? .red : .green)
                .frame(width: 200, height: 200)
                .offset(self.offset)
                .gesture(
                    DragGesture()
                        .onChanged{ gesture in
                            self.offset = gesture.translation
                    }
                    .onEnded{_ in
                        self.animationRunning = true
                        
                        withAnimation(.spring()){
                            self.offset = .zero
                        }
                })
            Spacer()
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

animation ios swift swiftui

13
推荐指数
1
解决办法
5254
查看次数

表单/工作表中的 SwiftUI 多个导航链接 - 条目保持突出显示

我有 Xcode 12/iOS 14 的问题。在带有 NavigationView 的工作表中使用多个 NavigationLink 会导致 NavigationLink 条目在返回页面后保持突出显示。这不仅是模拟器的问题。请参阅随附的 GIF:

在此处输入图片说明

有谁知道如何解决这个问题?

类似问题:SwiftUI - 表单中的 NavigationLink 单元格在详细信息弹出后保持突出显示(但这不是这里的问题)。

struct ContentView: View {
    
    var body: some View {
        Text("")
            .sheet(isPresented: .constant(true), content: {
                NavigationView {
                    Form {
                        Section {
                            NavigationLink("Link to ViewB", destination: ViewB())
                        }
                    }
                    .navigationBarTitle("ViewA")
                }
            }) 
    }
}

struct ViewB: View {
    @State var selection = 0
    let screenOptions = ["a", "b", "c"]
    var body: some View{
        Form {
            Section {
                NavigationLink("Link to ViewC", destination: ViewC()) …
Run Code Online (Sandbox Code Playgroud)

ios swift swiftui

8
推荐指数
1
解决办法
984
查看次数

ScrollView 中的 SwiftUI TapGesture 和 LongPressGesture,点击指示不起作用

我正在努力在 ScrollView 中同时实现 TapGesture 和 LongPressGesture。使用 .onTapGesture 和 .onLongPressGesture 一切正常,但我希望当用户点击按钮时,按钮的不透明度会降低,就像普通的 Button() 一样。

但是,无论出于何种原因,Button() 都无法选择在长按时执行某些操作。所以我尝试使用 .gesture(LongPressGesture() ... )。此方法有效并显示抽头指示。不幸的是,这不适用于 ScrollView:你不能再滚动它了!

所以我做了一些研究,我发现在 LongPressGesture 之前必须有一个 TapGesture 才能让 ScrollView 正常工作。确实如此,但我的 LongPressGesture 不再起作用。

希望有人有解决方案...


struct ContentView: View {
    var body: some View {
        ScrollView(.horizontal){
            HStack{
                ForEach(0..<5){ _ in
                    Button()
                }
            }
        }
    }
}

struct Button: View{
    
    @GestureState var isDetectingLongPress = false
    @State var completedLongPress = false
    
    var body: some View{
        
        Circle()
            .foregroundColor(.red)
            .frame(width: 100, height: 100)
            .opacity(self.isDetectingLongPress ? 0 : 1)
            
            // That works, but …
Run Code Online (Sandbox Code Playgroud)

xcode ios swift swiftui

6
推荐指数
1
解决办法
964
查看次数

SwiftUI ContextMenu:设置阴影形状或隐藏它

我想使用带有圆形按钮的上下文菜单。如果长按激活上下文菜单,按钮周围会出现一个圆角矩形的阴影。我已经尝试过使用.contentShape(Circle()),但这根本不起作用。

有没有办法隐藏这个阴影或改变它的形状,使其与按钮匹配?也许底层 UIKit 视图的属性可以修改?

谢谢回答!

在此输入图像描述

import SwiftUI

struct ContentView: View {
    var body: some View {
        Circle()
            .frame(width: 100, height: 100, alignment: .center)
            .foregroundColor(.yellow)
            .contentShape(Circle()) //does not work
            .contextMenu
        {
            Button(action: {}, label:
                    {
                Text("Action 1")
            })
            
            Button(action: {}, label:
                    {
                Text("Action 2")
            })
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

ios swift swiftui swiftui-contextmenu

6
推荐指数
1
解决办法
1336
查看次数

SwiftUI 如何从另一个类访问 ContentView 变量

我是 SwiftUI 的新手。在尝试改进我的计时器应用程序时,我陷入了困境。

在我的 ContentView 中,我有两个 ObservedObjects:管理计时器功能的 Timer 对象和存储所有用户设置的 Settings 对象。我的目标是,如果用户更改切换设置,则会在 ContentView 类中定义的 MyTimer 实例中设置一个变量。

我的问题是我不知道如何从类设置访问该实例。

这可能是一个非常简单的解决方案,但是,我已经尝试让它工作很长一段时间了,但我运气不好。

感谢您的帮助!


struct ContentView: View {

    @ObservedObject var myTimer = MyTimer()
    @ObservedObject var settings = Settings()

...

 Toggle(isOn: self.$settings.muteInSilenceMode) {
        Text("Mute sound in silence mode")
                                    }
...

}

class Settings: ObservableObject {

...

    @Published var muteInSilenceMode: Bool = UserDefaults.standard.bool(forKey: "muteInSilenceMode"){
              didSet{
                  UserDefaults.standard.set(self.muteInSilenceMode, forKey: "muteInSilenceMode"

                  // I want to access the Timer object from here

              }
          }
...

}

Run Code Online (Sandbox Code Playgroud)

variables class instance-variables swift swiftui

5
推荐指数
1
解决办法
2411
查看次数

SwiftUI 将 navigationBarItems 按钮与大 navigationBarTitle 对齐,如“消息”中所示

我正在创建一个 SwiftUI 应用程序,并使用 NavigationView 和一个大标题栏。但是,我不喜欢 navigationBarItems 按钮与消息应用程序(第一张和第二张图片)中的大标题栏(第三张图片)不对齐。我尝试重新定位按钮,但它不再可单击。有人知道如何解决这个问题吗?谢谢!

消息应用按钮对齐 第二:

消息应用按钮对齐

第三: 消息应用按钮对齐

xcode ios swift swiftui navigationbaritems

5
推荐指数
1
解决办法
2522
查看次数

带有 ForEach 删除动画的 SwiftUI 自定义列表不起作用

我正在创建一个显示时间信息的自定义列表(分钟和秒,未在下面的代码段中用于简化代码)。当用户向列表中添加一个条目时,我设法实现了一个很好的动画,但删除一个条目没有动画(第一个 GIF)。

在 iOS 14 中,动画可以正常工作,但是,动画只会从列表中删除最后一个矩形,然后更新每行中的文本(第二个 GIF)。这不是我想要的 - 我的目标是如果一行已被删除,其他行应该填满该空间并相应地移动 - 带有动画。

行的 ID 可能有问题,但我无法解决这个问题。感谢您的帮助!

在此处输入图片说明

在此处输入图片说明

struct ContentView: View {
    @State var minutes = [0]
    @State var seconds = [0]
    @State var selectedElement = 0
    
    var body: some View {
        ScrollView(){
            VStack{
                ForEach(minutes.indices, id: \.self){ elem in
                    
                    ZStack{
                        
                        EntryBackground()
                        
                        
                        Text("\(self.minutes[elem])")
                            .transition(AnyTransition.scale)
                        
                        HStack{
                            Button(action: {
                                withAnimation(.spring()){
                                    self.seconds.remove(at: elem)
                                    self.minutes.remove(at: elem)
                                }
                                
                            })
                            {
                                Image(systemName: "minus.circle.fill")
                                    .foregroundColor(Color.red)
                                    .font(.system(size: 22))
                                    .padding(.leading, 10)
                            }
                            Spacer()
                        }
                        
                    }
                    .padding(.horizontal)
                    .padding(.top)
                    .contentShape(Rectangle())
                    .onTapGesture {
                        withAnimation(.spring()){
                            self.selectedElement = elem …
Run Code Online (Sandbox Code Playgroud)

ios swift swiftui

5
推荐指数
1
解决办法
1961
查看次数

如何在 SwiftUI 中使用多个 Picker 更改 UIPickerView 宽度?

我需要使用 UIPickerView 而不是 SwiftUI Picker,因为它存在一些错误,并且我需要对其进行更多控制。

使用下面的方法一切正常,但是,我需要一个宽度较小的选择器(约为原始宽度的 70%),但仍然显示所有三个选择器,并且仍然具有灰色背景的圆角(因此灰色背景框架宽度和三个拾取器之间的间距应减小)。

我尝试修改选择器的框架及其超级视图,但这根本不起作用。在 SwiftUI 中设置框架宽度,然后使用剪裁修饰符切断圆边,并切断数字的某些部分(所以这是不可能的)。

有人知道该怎么做吗?多谢!

在此输入图像描述

import SwiftUI

struct ContentView: View {

    @State private var selections: [Int] = [5, 10, 50]

    var body: some View {
        MainPicker(pickerSelections: self.$selections)
    }
}

struct MainPicker: View {
    
    @Binding var pickerSelections: [Int]
    
    private let data: [[String]] = [
        Array(0...59).map { "\($0 < 10 ? "0" : "")" + "\($0)" },
        Array(0...59).map { "\($0 < 10 ? "0" : "")" + "\($0)" },
        Array(0...59).map { "\($0 < 10 ? "0" …
Run Code Online (Sandbox Code Playgroud)

uikit ios swift swiftui

3
推荐指数
1
解决办法
2315
查看次数

带有点击和拖动手势的 SwiftUI ScrollView

我正在尝试使用可以点击和拖动的元素来实现 ScrollView。它应该按以下方式工作:

  1. ScrollView 应该可以正常工作,因此向上/向下滑动不应干扰手势。
  2. 点击一个条目应该运行一些代码。如果有一个“敲击指示器”,那就太好了,这样用户就知道敲击已被注册(使这变得困难的是,敲击指示器应该在触摸触发,而不是在触摸触发,并且应该处于活动状态直到手指松开)。
  3. 长按条目应激活拖动手势,以便可以四处移动项目。

下面的代码涵盖了所有这些要求(抽头指示器除外)。但是,我不确定它为什么起作用,具体来说,为什么我需要使用 .highPriorityGesture 并且例如不能对 Tap Gesture 和 DragGesture 进行排序.sequenced(before: ...)(这会阻止滚动)。

另外,我希望在触地事件时收到通知(不是触地,参见 2.)。我尝试使用 LongPressGesture() 而不是 TapGesture(),但这也会阻止 ScrollView 滚动,之后甚至不会触发 DragGesture。

有人知道这是如何实现的吗?或者这就是 SwiftUI 的极限?如果是这样,是否有可能移植 UIKit 的东西来实现这一点(我也已经尝试过,但没有成功,ScrollView 的内容也应该是动态的,因此移植整个 ScrollView 可能很困难)?

谢谢你的协助!

struct ContentView: View {
   
    var body: some View {
        ScrollView() {
            ForEach(0..<5, id: \.self) { i in
                ListElem()
                    .highPriorityGesture(TapGesture().onEnded({print("tapped!")}))
                    .frame(maxWidth: .infinity)
            }
        }
    }
}

struct ListElem: View {
    @GestureState var dragging = CGSize.zero
    
    var body: some View {
        Circle() …
Run Code Online (Sandbox Code Playgroud)

ios swift swiftui

1
推荐指数
1
解决办法
2219
查看次数