import Foundation
import SwiftUI
import PlaygroundSupport
PlaygroundPage.current.setLiveView(
SplitView().frame(width: 600, height:600).border(Color.black)
)
struct SplitView: View {
@State var position: CGFloat = 10.0
var body: some View {
Text("top")
.frame(height: position)
PaneDivider(position: $position)
Text("bottom")
Spacer()
}
}
struct PaneDivider: View {
@Binding var position: CGFloat
@GestureState private var isDragging = false // Will reset to false when dragging has ended
var body: some View {
Rectangle().frame(height:10).foregroundColor(Color.gray)
.onHover { inside in
if !isDragging {
if inside { NSCursor.resizeUpDown.push() }
else { NSCursor.pop() }
}
}
.gesture(DragGesture()
.onChanged { position += $0.translation.height }
.updating($isDragging) { (value, state, transaction) in
if !state { NSCursor.resizeUpDown.push() } // This is overridden, something else in the system is pushing the arrow cursor during the drag
state = true
}
.onEnded { _ in NSCursor.pop() })
}
}
5条答案
按热度按时间guz6ccqo1#
这不是
NSCursor
的工作方式。它有一个光标堆栈,因此任何标准(或非标准)控件都可以将自己类型的光标推到顶部,并使该光标成为当前光标。因此,您只需放置第一个光标,但随后某个标准视图会使用自己的默认光标替换它。由于SwiftUI现在不允许本地管理游标,因此解决方案可能是
a)在SwiftUI视图上设置/推动所需光标出现/消失,或
B)使用标准
NSView.addCursorRect
方法将光标矩形添加到NSHostingController
视图。**更新:**来自现有项目的一些快速演示(自定义按钮解决方案的一部分)
ddrv8njm2#
下面是Swift Playground代码来说明这个问题:
设置断点-[NSCursor set]显示它在拖入过程中持续触发
SwiftUI之前的问题似乎与http://cocoadev.github.io/CursorFlashingProblems/相同
在DragGesture的开头添加
NSApp.windows[0].disableCursorRects()
,在.onEnded
中添加NSApp.windows[0].enableCursorRects()
,我在这里解决了这个问题。除了
NSApp.windows[0]
并不总是前窗口外,该死的NSApp.windows.forEach { $0.disableCursorRects() }
却能工作。)camsedfj3#
macCatalyst中不存在
onHover
,但您可以自己添加它。https://stackoverflow.com/a/60748101/1450348解释了替代解决方案ngynwnxp4#
就像评论中提到的Avitzur,有一个 Flink 的问题,使光标改变为默认值(特别是如果你有一些动画发生时,悬停在视图上),我做了以下:
用法:
vq8itlhq5#
我一直在尝试解决这个问题,这个页面不断出现。所以我想我应该发布我的解决方案
用途
如果你想使用SF字体,就把它加到你的按钮上
或者使用资源中的图像
我建议对按钮使用样式。你可以给样式添加修饰符,这样你所有的按钮都能得到相同的悬停效果。例如
然后把你的扣子这样做