Pilih SwiftUI Canvas apabila tindakan menyeret memerlukan peraturan peletakan khusus yang boleh anda laksanakan sendiri. Pilih SpriteKit apabila bentuk perlu menolak, melantun atau terus bergerak berdasarkan fizik. Mulakan dengan menentukan perkara yang berlaku apabila bentuk yang diseret bertemu dengan bentuk lain.

Panduan ini membincangkan satu tugasan: memilih seni bina interaksi untuk app Mac yang mengandungi bulatan atau segi empat tepat sintetik dalam memori, yang diseret pengguna dalam ruang kerja milik app. Keputusan bergantung pada tingkah laku perlanggaran, penghalaan input dan komponen yang mengawal kedudukan setiap bentuk.

Apakah yang patut berlaku apabila dua bentuk bertemu?

“Respons perlanggaran” boleh merujuk kepada beberapa keperluan yang berbeza. Menyerlahkan pertindihan, menolak kedudukan yang tidak sah dan membuat dua objek melantun memerlukan mekanisme yang berbeza. Apple membezakan secara jelas antara sentuhan SpriteKit, yang melaporkan badan yang bersentuhan, dengan perlanggaran, yang mengira respons fizikal dan mengenakan impuls. About Collisions and Contacts

Tingkah laku yang diingini Titik permulaan yang praktikal Tanggungjawab yang anda kekalkan
Serlahkan pertindihan sementara penuding meletakkan bentuk dengan bebas Canvas dengan ujian geometri tersuai Pemilihan, pengesanan pertindihan dan maklum balas visual
Hentikan bentuk pada halangan pertama Canvas dengan kekangan pergerakan tersuai Menguji laluan pergerakan dan menentukan kedudukan yang diterima
Menolak bentuk bersebelahan dan membolehkannya berhenti atau melantun SpriteKit Konfigurasi fizik dan pengawal seretan
Berikan setiap item kawalan dan gerak isyarat SwiftUI biasa Paparan SwiftUI individu Peraturan pertindihan atau pergerakan khusus app

Ini ialah saranan seni bina berdasarkan keupayaan yang didokumenkan, bukannya ambang prestasi Apple. Bilangan bentuk yang kecil tidak semestinya menjadikan Canvas pilihan yang lebih baik, dan bilangan yang besar tidak semestinya memerlukan SpriteKit. Tentukan tingkah laku dahulu, kemudian ukur pelaksanaan dengan item yang mewakili penggunaan sebenar.

Terdapat juga kekangan interaksi yang berguna: penjejakan penuding yang tepat boleh bercanggah dengan syarat tiada pertindihan. Jika penuding bergerak melalui kedudukan yang sudah diduduki, app perlu membenarkan item bertindih, menghentikannya di belakang penuding atau menggerakkan item lain. Tetapkan pilihan itu sebelum memilih pemapar.

Apakah yang disediakan oleh Canvas, dan apakah yang perlu anda bina?

Canvas menyediakan lukisan mod segera melalui konteks grafik. Bulatan, laluan dan simbolnya tidak menjadi elemen interaktif yang berasingan. Apple juga menyatakan bahawa Canvas tidak menyediakan kebolehcapaian untuk elemen yang dilukis secara individu, termasuk simbol yang dibekalkan sebagai paparan. Oleh itu, gerak isyarat yang dilampirkan pada kanvas memerlukan logik app untuk menentukan item yang dipilih pengguna. Canvas

Untuk editor dengan peraturan peletakan khusus, simpan bentuk dalam model dan anggap lukisan sebagai gambaran model itu. Setiap item boleh mengandungi pengecam, titik tengah, dimensi dan susunan lukisan. Panduan Swift mengesyorkan struktur sebagai pilihan lalai untuk data biasa dan kelas apabila identiti bersama atau pewarisan rangka kerja diperlukan. Model item jenis nilai dan subkelas adegan SpriteKit mempunyai tujuan yang berbeza. Choosing Between Structures and Classes

Seretan Canvas boleh mengikut urutan ini:

  1. Pada permulaan gerak isyarat, uji lokasi penuding awal terhadap item mengikut susunan lukisan terbalik dan pilih item pertama yang sepadan.
  2. Kekalkan pengecam yang dipilih serta titik tengah asalnya sepanjang gerak isyarat.
  3. Kira setiap titik tengah yang dicadangkan daripada titik tengah asal itu ditambah translasi keseluruhan gerak isyarat.
  4. Gunakan sempadan ruang kerja dan peraturan perlanggaran untuk mendapatkan titik tengah yang diterima.
  5. Kemas kini model; biarkan Canvas melukis semula daripadanya.
  6. Kosongkan pilihan apabila gerak isyarat tamat dan tentukan cara membersihkannya jika interaksi terganggu.

Perbezaan antara pergerakan keseluruhan dengan pergerakan tambahan adalah penting. SwiftUI mentakrifkan translation sebagai pergerakan dari permulaan gerak isyarat. Menambah jumlah pergerakan itu berulang kali pada titik tengah yang sudah dikemas kini akan menghasilkan pergerakan berlebihan. Gunakan titik tengah permulaan yang dikekalkan setiap kali. SwiftUI menyediakan startLocation, location dan translation melalui nilai gerak isyarat serta membolehkan anda menetapkan ruang koordinat gerak isyarat. DragGesture.Value, DragGesture

Kekalkan pilihan sepanjang seretan. Mengulangi operasi pemilihan awal pada setiap kemas kini penuding boleh menukar item yang dipilih apabila penuding melintasi bentuk lain. Begitu juga, mengekalkan ofset asal antara penuding dengan titik tengah mengelakkan bentuk melompat sehingga titik tengahnya tiba-tiba berada di bawah penuding. Ini ialah peraturan reka bentuk app, bukannya tingkah laku yang disediakan Canvas secara automatik.

Contoh lengkap: pengesanan pertindihan berbanding pergerakan yang disekat

Katakan terdapat dua bulatan ilustrasi, masing-masing dengan jejari 20 mata. Bulatan A bermula pada (100, 100) dan bulatan B yang pegun berada pada (200, 100). Pengguna meminta titik tengah A berada pada (190, 100). Jarak antara titik tengahnya ialah 10 mata; jumlah jejari kedua-duanya ialah 40. Kedudukan itu akan bertindih.

Untuk penunjuk pertindihan, terima kedudukan itu dan ubah lukisan. Untuk seretan mendatar yang disekat, kedudukan pertama yang bersentuhan ialah (160, 100): jarak antara titik tengahnya ketika itu ialah 40 mata. Pengiraan ini mengandaikan bahawa B kekal pegun, saiz kedua-dua bulatan tidak berubah dan A mengikuti laluan mendatar.

Sekarang katakan satu kemas kini penuding meminta (260, 100). Menguji titik hujung sahaja tidak menemui pertindihan, walaupun laluan pergerakan melintasi B. Pelaksanaan seretan yang disekat memerlukan ujian persilangan sepanjang laluan atau kaedah khusus lain untuk memeriksa laluan perantaraan. Menolak titik hujung yang bertindih sahaja tidak melaksanakan arahan “berhenti pada halangan pertama”.

Contoh ini ialah sebab utama respons perlanggaran perlu ditakrifkan dengan tepat. Beberapa ujian geometri titik hujung mungkin memadai untuk ciri penyerlahan pertindihan. Menyokong pergerakan menggelongsor mengelilingi halangan, sentuhan serentak atau pergerakan item bersebelahan akan memperluas penyelesai tersuai dengan ketara. Canvas masih boleh digunakan sebagai pilihan lukisan, tetapi app anda perlu mengendalikan tingkah laku tambahan itu.

Bilakah SpriteKit menjadi pilihan yang lebih sesuai?

SpriteKit lebih sesuai apabila respons perlanggaran patut terhasil daripada simulasi. Melampirkan SKPhysicsBody pada nod membolehkan pengiraan yang melibatkan graviti, geseran dan perlanggaran; simulasi itu kemudian mengemas kini kedudukan dan orientasi nod. Ia menyokong badan isipadu untuk objek dan badan tepi untuk sempadan. SKPhysicsBody

Untuk prototaip awal, gunakan dua bulatan yang terpisah dan sempadan ruang kerja segi empat tepat. Berikan bulatan itu badan bulat yang sepadan, nyahdayakan graviti untuk ruang kerja seperti permukaan meja dan tentukan sama ada putaran menyumbang kepada interaksi. Konfigurasikan geseran, lantunan dan redaman dengan sengaja dan bukannya bergantung pada nilai lalainya. Sifat tersebut menentukan aspek tingkah laku fizikal yang berbeza. SKPhysicsBody

SwiftUI boleh mengehos adegan secara langsung menggunakan SpriteView, yang didokumenkan Apple sebagai paparan SwiftUI yang memaparkan adegan SpriteKit. Ketersediaan Mac yang didokumenkan bermula dengan macOS 11; Canvas pula bermula dengan macOS 12. Oleh itu, sasaran penggunaan turut mempengaruhi keputusan, walaupun tingkah laku interaksi kekal sebagai kriteria utama. SpriteView, Canvas

Konfigurasikan respons perlanggaran secara berasingan daripada pemberitahuan

Tetapkan kategori kepada bentuk dan sempadan anda, kemudian konfigurasikan kedua-dua topeng interaksi secara jelas:

  • categoryBitMask mengenal pasti kategori yang dimiliki oleh sesuatu badan.
  • collisionBitMask memilih kategori yang boleh memberi kesan fizikal kepada badan itu.
  • contactTestBitMask meminta pemberitahuan sentuhan untuk kategori terpilih.

Topeng perlanggaran dinilai secara berasingan bagi setiap badan. Untuk respons bersama biasa antara dua bentuk dinamik, konfigurasikan kedua-dua badan supaya bertindak balas terhadap kategori badan yang satu lagi. Pelaporan sentuhan mempunyai peraturan yang berbeza: perbandingan kategori/topeng sentuhan yang sepadan dalam salah satu arah boleh menghasilkan pemberitahuan. Mengaktifkan pemberitahuan sahaja tidak mengkonfigurasikan sekatan fizikal. collisionBitMask, contactTestBitMask

Jika badan bertindak balas secara fizikal tetapi panggilan balik tidak diterima, periksa topeng sentuhan dan perwakilan sentuhan dunia fizik. Jika panggilan balik diterima sementara bentuk saling menembusi, periksa topeng perlanggaran dan pengawal pergerakan. Pemeriksaan ini membezakan konfigurasi pemberitahuan daripada masalah pergerakan sebenar.

Siapakah yang mengawal kedudukan semasa pengguna menyeret?

Seretan SpriteKit memerlukan pengawal yang jelas. Enjin fizik dengan sendirinya bukan interaksi yang mengikuti penuding. Pilih antara peletakan langsung dengan pergerakan yang dipacu simulasi berdasarkan tingkah laku yang ditentukan sebelum ini.

Dengan peletakan langsung, kod app menetapkan kedudukan nod yang diseret. Ini sesuai apabila item mesti diletakkan tepat mengikut penuding, tetapi tindakan itu sendiri tidak menentukan laluan yang diselesaikan secara fizikal antara kedudukan berturutan. Mematikan isDynamic menyebabkan badan mengabaikan daya dan impuls; tindakan itu tidak mewujudkan penyelesai seretan. Jika anda mengubah sifat ini buat sementara waktu, tentukan masa ia dipulihkan dan sama ada pergerakan dikekalkan atau dikosongkan selepas pelepasan. isDynamic

Dengan seretan yang dipacu simulasi, kekalkan lokasi penuding sebagai sasaran dan gunakan daya atau pengawal berasaskan spring untuk membimbing badan dinamik ke arahnya. Simulasi itu kemudian boleh menyelesaikan sentuhan semasa badan bergerak. Kesannya ialah kelewatan yang disengajakan atau anjakan daripada penuding apabila objek lain menghalang pergerakan. SpriteKit menyokong penggunaan daya, manakala SKPhysicsJointSpring menghubungkan dua badan fizik dengan tingkah laku spring. Kedua-duanya ialah bahan binaan yang memerlukan pelarasan khusus app. SKPhysicsBody, SKPhysicsJointSpring

Elakkan daripada menetapkan kedudukan penuding secara berterusan sambil mengharapkan fizik mengawal kedudukan yang sama secara berasingan. Urutan bingkai SpriteKit yang didokumenkan menjalankan kemas kini app, tindakan, fizik dan panggilan balik seterusnya pada peringkat yang berasingan. Peraturan pemilikan yang berguna ialah membiarkan input mengemas kini sasaran seretan, logik adegan menggunakan pengawal dan fizik menghasilkan kedudukan akhir badan. Responding to Frame-Cycle Events

Panggilan balik sentuhan juga mempunyai had yang didokumenkan. Apple menyatakan bahawa panggilan ini dijalankan semasa langkah simulasi fizik, apabila pengubahsuaian dunia fizik tidak disokong dan perubahan pada badan yang disimulasikan membawa tingkah laku yang tidak ditakrifkan. Rekodkan kerja tertunda dalam panggilan balik dan gunakan perubahan fizik semasa kemas kini berikutnya, mengikut corak bendera dan kemas kini Apple. SKPhysicsContactDelegate

Bagaimanakah input macOS patut merentasi sempadan rangka kerja?

Pilih satu pemilik input untuk ruang kerja. Pelaksanaan Canvas boleh melampirkan DragGesture SwiftUI pada permukaan interaksinya. Permukaan AppKit tersuai boleh mengendalikan peristiwa responder; mouseDragged(with:) menerima pergerakan apabila butang tetikus kiri ditekan. Elakkan daripada membiarkan gerak isyarat SwiftUI tindihan dan pengendali AppKit menggerakkan item terpilih yang sama secara berasingan. DragGesture, mouseDragged(with:)

Untuk jambatan AppKit ke SpriteKit, tukarkan koordinat pada setiap sempadan. NSEvent.locationInWindow biasanya dinyatakan dalam sistem koordinat asas tetingkap yang berkaitan. Tukarkan titik itu kepada koordinat paparan pengehos, kemudian tukarkannya daripada koordinat paparan kepada koordinat adegan. Apple menyediakan convertPoint(fromView:) untuk langkah kedua dan mewajibkan adegan dipaparkan sebelum kaedah itu dipanggil. Kedudukan nod dinyatakan dalam sistem koordinat induknya, jadi nod bersarang mungkin memerlukan penukaran tambahan. locationInWindow, convertPoint(fromView:), position

Gunakan SpriteView untuk pengehosan SwiftUI yang mudah. Jika anda memerlukan paparan AppKit tersuai, NSViewRepresentable menyediakan penciptaan, kemas kini, penyelarasan dan penguraian. Biarkan SwiftUI mengawal reka letak paparan yang diwakilkan: Apple secara jelas memberi amaran supaya anda tidak menetapkan bingkai atau sempadan yang diuruskannya sendiri. NSViewRepresentable

Kekalkan adegan dalam pemilik yang stabil dan bukannya membina adegan baharu setiap kali SwiftUI mengira semula kandungan paparan. Untuk Canvas, kekalkan model item dengan cara yang sama. Dokumentasi model SwiftUI menerangkan cara keadaan terurus mengekalkan tika merentasi penciptaan semula paparan; pendekatan Observation memerlukan macOS 14 atau lebih baharu. Anggap arahan adegan dan petikan model sebagai pemindahan yang disengajakan supaya dua salinan boleh ubah tidak bersaing untuk menentukan kedudukan. Managing model data in your app

Apakah yang patut anda uji sebelum memilih salah satu pendekatan?

Gunakan ruang kerja sintetik yang kecil untuk menguji interaksi sukar sebelum menambah kemasan visual:

  1. Pegang berhampiran tepi bentuk dan pastikan ofset awal dikekalkan.
  2. Seret perlahan-lahan ke item lain, kemudian ulangi dengan satu pergerakan penuding besar yang melintasinya.
  3. Seret ke arah penjuru yang mengandungi dua bentuk bersebelahan.
  4. Lepaskan semasa menyentuh item lain dan periksa tingkah laku berhenti yang dimaksudkan.
  5. Ubah saiz ruang kerja dan sahkan pemilihan, sempadan serta penukaran koordinat.
  6. Cipta semula kandungan SwiftUI di sekelilingnya dan pastikan kedudukan item kekal.
  7. Ganggu seretan dan pastikan pilihan serta sebarang tetapan fizik sementara dibersihkan.

Dalam SpriteKit, aktifkan SKView.showsPhysics semasa memastikan geometri badan sepadan dengan kawasan perlanggaran yang dimaksudkan. Untuk badan kecil yang bergerak pantas, nilai usesPreciseCollisionDetection; Apple mendokumenkan kos pengiraannya yang lebih tinggi dan peranannya mengesan perlanggaran yang mungkin terlepas daripada pemeriksaan biasa berasaskan bingkai. Ciri ini tidak sepatutnya menggantikan pengawal seretan yang koheren. SKView, usesPreciseCollisionDetection

Pilih Canvas apabila peraturan peletakan anda kekal jelas, terbatas dan lebih mudah dinyatakan secara langsung. Pilih SpriteKit apabila interaksi fizikal antara bentuk menjadi sebahagian daripada tugasan. Dalam kedua-dua pelaksanaan, seretan desktop yang boleh diharap bermula dengan satu item terpilih, penukaran koordinat yang jelas dan satu komponen yang bertanggungjawab bagi setiap kemas kini kedudukan.

Sumber