Saya mencoba memahami fungsi dari metode ini. Bisakah Anda memberi saya usecase sederhana untuk memahami semantik mereka?
Dari dokumentasi, misalnya, metode convertPoint: fromView: dijelaskan sebagai berikut:
Mengubah titik dari sistem koordinat pandangan yang diberikan ke penerima.
Apa arti sistem koordinat ? Bagaimana dengan penerima ?
Misalnya, apakah masuk akal menggunakan convertPoint: fromView: seperti berikut ini?
CGPoint p = [view1 convertPoint:view1.center fromView:view1];
Menggunakan utilitas NSLog, saya telah memverifikasi bahwa nilai p bertepatan dengan pusat view1.
Terima kasih sebelumnya.
SUNTING: bagi mereka yang tertarik, saya telah membuat cuplikan kode sederhana untuk memahami metode ini.
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 150, 200)];
view1.backgroundColor = [UIColor redColor];
NSLog(@"view1 frame: %@", NSStringFromCGRect(view1.frame));
NSLog(@"view1 center: %@", NSStringFromCGPoint(view1.center));
CGPoint originInWindowCoordinates = [self.window convertPoint:view1.bounds.origin fromView:view1];
NSLog(@"convertPoint:fromView: %@", NSStringFromCGPoint(originInWindowCoordinates));
CGPoint originInView1Coordinates = [self.window convertPoint:view1.frame.origin toView:view1];
NSLog(@"convertPoint:toView: %@", NSStringFromCGPoint(originInView1Coordinates));
Dalam kedua kasus, jendela mandiri adalah penerima. Tetapi ada perbedaan. Dalam kasus pertama, parameter convertPoint diekspresikan dalam koordinat view1. Outputnya adalah sebagai berikut:
convertPoint: fromView: {100, 100}
Yang kedua, sebagai gantinya, convertPoint dinyatakan dalam superview (self.window) koordinat. Outputnya adalah sebagai berikut:
convertPoint: toView: {0, 0}
convertPoint
danconvertRect
berbeda dalam jenis pengembalian.CGPoint
atauCGRect
. Tapi bagaimana denganfrom
danto
? Apakah ada aturan praktis yang bisa saya gunakan? Terima kasih.Saya selalu menemukan ini membingungkan jadi saya membuat taman bermain di mana Anda dapat menjelajahi secara visual apa
convert
fungsinya. Ini dilakukan dalam Swift 3 dan Xcode 8.1b:Ingatlah untuk memperlihatkan Asisten Editor ( ⎇⌘⏎) untuk melihat tampilan, tampilannya akan seperti ini:
Jangan ragu untuk berkontribusi lebih banyak contoh di sini atau di intisari ini .
sumber
self.view
berlebihan, penggunaan sederhanaview
jikaself
tidak diperlukan.self
Berikut ini penjelasan dalam Bahasa Inggris.
Saat Anda ingin mengonversi kotak dari subview (
aView
adalah subview dari[aView superview]
) ke ruang koordinat tampilan lain (self
).sumber
Setiap tampilan di iOS memiliki sistem koordinat. Sistem koordinat sama seperti grafik, yang memiliki sumbu x (garis horizontal) dan sumbu y (garis vertikal). Titik di mana garis interesect disebut asal. Suatu titik diwakili oleh (x, y). Misalnya, (2, 1) berarti bahwa intinya adalah 2 piksel tersisa, dan 1 piksel turun.
Anda dapat membaca lebih lanjut tentang sistem koordinat di sini - http://en.wikipedia.org/wiki/Coordinate_system
Tapi yang perlu Anda ketahui adalah bahwa, di iOS, setiap tampilan memiliki sistem koordinatnya SENDIRI, di mana sudut kiri atas adalah asalnya. Sumbu X terus meningkat ke kanan, dan sumbu y terus meningkat ke bawah.
Untuk pertanyaan tentang titik konversi, ambil contoh ini.
Ada tampilan, yang disebut V1, yang lebar 100 piksel dan tinggi 100 piksel. Sekarang di dalam itu, ada pandangan lain, yang disebut V2, di (10, 10, 50, 50) yang berarti bahwa (10, 10) adalah titik dalam sistem koordinat V1 di mana sudut kiri atas V2 harus ditempatkan, dan ( 50, 50) adalah lebar dan tinggi V2. Sekarang, ambil titik di dalam sistem koordinat V2, katakan (20, 20). Sekarang, apa gunanya di dalam sistem koordinat V1? Itulah gunanya metode (tentu saja Anda dapat menghitung sendiri, tetapi mereka menghemat kerja ekstra). Sebagai catatan, titik dalam V1 adalah (30, 30).
Semoga ini membantu.
sumber
Terima kasih semua telah mengirimkan pertanyaan dan jawaban Anda: Ini membantu saya menyelesaikan masalah ini.
Pengontrol tampilan saya memiliki tampilan normal.
Di dalam tampilan itu ada sejumlah pandangan pengelompokan yang tidak lebih dari memberikan pandangan anak mereka interaksi yang bersih dengan kendala tata letak otomatis.
Di dalam salah satu pandangan pengelompokan itu saya memiliki tombol Tambah yang menyajikan pengontrol tampilan popover tempat pengguna memasukkan beberapa informasi.
Selama rotasi perangkat, pengendali tampilan diperingatkan melalui panggilan UIPopoverViewControllerDelegate popoverController: willRepositionPopoverToRect: inView:
Bagian penting yang berasal dari penjelasan yang diberikan oleh dua jawaban pertama di atas adalah bahwa rect yang perlu saya konversi adalah batasnya tombol add, bukan bingkainya.
Saya belum mencoba ini dengan hierarki tampilan yang lebih kompleks, tetapi saya curiga bahwa dengan menggunakan tampilan yang disediakan dalam pemanggilan metode (inView :) kita dapat mengatasi berbagai kerumitan tampilan daun multi-tingkat jenis keburukan.
sumber
Saya menggunakan pos ini untuk menerapkan dalam kasus saya. Semoga ini bisa membantu pembaca lain di masa depan.
Tampilan hanya dapat melihat tampilan langsung anak-anak dan orang tuanya. Itu tidak bisa melihat pandangan orang tua atau cucu-cucunya.
Jadi, dalam kasus saya, saya memiliki pandangan orang tua besar yang disebut
self.view
, dalam hal iniself.view
saya telah menambahkan subviews disebutself.child1OfView
,self.child2OfView
. Dalamself.child1OfView
, saya telah menambahkan subviews disebutself.child1OfView1
,self.child2OfView1
.Sekarang jika saya secara fisik pindah
self.child1OfView1
ke area di luar batasself.child1OfView
untuk anther spot onself.view
, maka untuk menghitung posisi baru untukself.child1OfView1
dalamself.view:
sumber
Anda dapat melihat kode di bawah ini sehingga Anda dapat memahami bahwa cara kerjanya sebenarnya.
sumber
Saya membaca jawabannya dan memahami mekanika tetapi saya pikir contoh terakhirnya tidak benar. Menurut dokumen API, properti tengah tampilan berisi titik tengah tampilan yang dikenal dalam sistem koordinat superview.
Jika ini masalahnya, maka saya pikir tidak masuk akal untuk mencoba meminta superview untuk mengubah pusat subview DARI sistem koordinat subview karena nilainya tidak dalam sistem koordinat subview. Apa yang masuk akal adalah melakukan yang sebaliknya yaitu mengkonversi dari sistem koordinat superview ke subview ...
Anda dapat melakukannya dengan dua cara (keduanya harus menghasilkan nilai yang sama):
atau
Apakah saya mengerti bagaimana ini seharusnya bekerja?
sumber
Satu lagi poin penting tentang penggunaan API ini. Pastikan rantai tampilan induk selesai antara kotak yang Anda konversi dan tampilan ke / dari. Misalnya - aView, bView, dan cView -
Jika kita mencoba menjalankan metode sebelum bView telah ditambahkan sebagai subview dari cView, kita akan mendapatkan respons bunk. Sayangnya tidak ada perlindungan yang dibangun ke dalam metode untuk kasus ini. Ini mungkin tampak jelas, tetapi itu adalah sesuatu yang harus diperhatikan dalam kasus-kasus di mana pertobatan berlangsung melalui rantai panjang orang tua.
sumber