SwiftUI: перетащите ОКНО левой кнопкой мыши вниз на представление

#swift #macos #swiftui

#swift #macos #swiftui

Вопрос:

У меня есть представление с изображением в нем.

 @SceneBuilder
var body: some Scene {
    WindowGroup {
        ImageView()
    }
}
 

ImageView — это просто изображение:

 struct ImageView: View  {
    var body: some View {
        Image(.logo)
            .resizable()
            .scaledToFill()
    }
}
 

Как перетащить окно, нажав на ImageView левую кнопку мыши?

Точно так же, как мы перетаскиваем окно, щелкая по заголовку окна / заголовку / зоне безопасной зоны.

macOS, SwiftUI 3

Google не показал ничего полезного

Комментарии:

1. @SceneBuilder это что-то новое или пользовательский код? Я этого не видел.

2. @swiftPunk это родная вещь swiftwithmajid.com/2020/06/23/what-is-new-in-swiftui , по сравнению со SwiftUI 2

Ответ №1:

использование:

 Text("drag wnd with me")
    .dragWndWithClick()

 

Обратный код:

 import Foundation
import SwiftUI

@available(OSX 11.0, *)
extension View {
    func dragWndWithClick() -> some View {
        self.overlay(DragWndView())
    }
}

struct DragWndView: NSViewRepresentable {
    func makeNSView(context: Context) -> NSView {
        return DragWndNSView()
    }
    
    func updateNSView(_ nsView: NSView, context: Context) { }
}

class DragWndNSView: NSView {
    override public func mouseDown(with event: NSEvent) {
        NSApp?.mainWindow?.performDrag(with: event)
    }
}
 

Комментарии:

1. Вы определили класс с именем App !!!, но как? это невозможно. Неясно, как на самом деле ваш ответ может быть использован или даже работает. Вы можете показать рабочий пример, чтобы сделать неясную часть понятной.

2. Совершенно неясно, как вы будете использовать свой класс.

3. опубликовано лучшее решение. Удалены все старые комментарии

4. Я думаю, что было бы проблематично перетащить жест в SwiftUI, может возникнуть проблема с нажатием кнопки или ползунка или даже перетаскиванием фигур в поле зрения.

5. да, это может быть. Единственное, что вам нужно, это сделать ZStack и применить этот модификатор только к фоновому слою, и никаких проблем с кнопками или жестами, расположенными на переднем слое 🙂