Saya telah mencari ini selama berjam-jam tetapi saya gagal. Saya mungkin bahkan tidak tahu apa yang seharusnya saya cari.
Banyak aplikasi memiliki teks dan dalam teks ini adalah hyperlink web dalam bentuk bulat. Ketika saya mengklik mereka UIWebView
terbuka. Yang membingungkan saya adalah mereka sering memiliki tautan khusus, misalnya jika kata-kata dimulai dengan # itu juga dapat diklik dan aplikasi merespons dengan membuka tampilan lain. Bagaimana saya bisa melakukan itu? Apakah mungkin dengan UILabel
atau saya perlu UITextView
atau sesuatu yang lain?
ios
hyperlink
uilabel
nsattributedstring
uitapgesturerecognizer
Berlari dgn lompatan
sumber
sumber
Swift 4
solusi yang berfungsi penuh . MenggunakanUITextView
tetapi membuatnya berperilaku sepertiUILabel
. Saya mencoba solusinya di sini, dan gagal mendapatkan deteksi tautan yang akurat.Jawaban:
Secara umum, jika kita ingin memiliki tautan yang dapat diklik dalam teks yang ditampilkan oleh UILabel, kita perlu menyelesaikan dua tugas independen:
Yang pertama mudah. Mulai dari iOS 6 UILabel mendukung tampilan string yang dikaitkan. Yang perlu Anda lakukan adalah membuat dan mengonfigurasikan instance NSMutableAttributedString:
Itu dia! Kode di atas membuat UILabel untuk menampilkan String dengan tautan
Sekarang kita harus mendeteksi sentuhan pada tautan ini. Idenya adalah menangkap semua ketukan di dalam UILabel dan mencari tahu apakah lokasi keran cukup dekat dengan tautan. Untuk menangkap sentuhan, kita dapat menambahkan pengenal isyarat ketuk pada label. Pastikan untuk mengaktifkan interaksi Pengguna untuk label, ini dimatikan secara default:
Sekarang hal yang paling canggih: cari tahu apakah keran ada di tempat tautan ditampilkan dan bukan pada bagian label lainnya. Jika kami memiliki UILabel baris tunggal, tugas ini dapat diselesaikan dengan relatif mudah dengan melakukan hardcoding batas area tempat tautan ditampilkan, tetapi mari kita selesaikan masalah ini dengan lebih elegan dan untuk kasus umum - multiline UILabel tanpa pengetahuan awal tentang tata letak tautan.
Salah satu pendekatan adalah menggunakan kemampuan API Kit Teks yang diperkenalkan di iOS 7:
Simpan contoh NSLayoutManager, NSTextContainer, dan NSTextStorage yang dibuat dan dikonfigurasikan di properti di kelas Anda (kemungkinan besar keturunan UIViewController) - kami akan membutuhkannya dalam metode lain.
Sekarang, setiap kali label mengubah bingkainya, perbarui ukuran textContainer:
Dan akhirnya, deteksi apakah keran itu ada di tautan:
sumber
cellForRowAtIndexPath
? Saya membuat dan mengonfigurasi instance di dalamcellForRowAtIndexPath
dan hostinghandleTapOnLabel
fungsi di dalamnya juga. Tapi padacell.textLabel.addGestureRecognizer(UITapGestureRecognizer(target: cell, action: "handleTapOnLabel:"))
, saya mengertiunrecognized selector
.textAlignment
atribut label diatur keNSTextAlignmentCenter
. Jika Anda menggunakan teks yang tidak terpusat, Anda harus menyesuaikan perhitungan AndatextContainerOffset
dalam kode di atas.x
nilaitextContainerOffset
, konstanta0.5
digunakan. Ini akan menghitung posisi yang benar untukNSTextAlignmentCenter
. Untuk menyelaraskan ke kiri, alami atau dibenarkan, gunakan nilai0.0
. Untuk menyelaraskan ke kanan, gunakan1.0
.Saya memperluas solusi terperinci @NAlexN asli, dengan ekstensi @zekel yang sangat baik
UITapGestureRecognizer
, dan menyediakan di Swift .Memperluas UITapGestureRecognizer
Pemakaian
Atur
UIGestureRecognizer
untuk mengirim tindakantapLabel:
, dan Anda dapat mendeteksi jika rentang target sedang digunakanmyLabel
.PENTING:
UILabel
Mode jeda baris harus diatur agar dibungkus dengan kata / char. Entah bagaimana,NSTextContainer
akan menganggap bahwa teks hanya satu baris jika mode break baris sebaliknya.sumber
targetRange1
dantargetRange2
.NSMutableAttributedString(attributedString: text)
tempat 'teks' adalahNSAttributedString
Pertanyaan lama tetapi jika ada yang bisa menggunakan
UITextView
bukanUILabel
, maka itu mudah. URL standar, nomor telepon, dll. Akan secara otomatis terdeteksi (dan dapat diklik).Namun, jika Anda memerlukan deteksi khusus, yaitu, jika Anda ingin dapat memanggil metode kustom apa pun setelah pengguna mengklik kata tertentu, Anda perlu menggunakan
NSAttributedStrings
denganNSLinkAttributeName
atribut yang akan mengarah ke skema URL khusus (sebagai lawan dari memiliki skema http url secara default). Ray Wenderlich membahasnya di siniMengutip kode dari tautan yang disebutkan di atas:
Untuk mendeteksi klik tautan tersebut, terapkan ini:
PS: Pastikan
UITextView
sudahselectable
.sumber
UIButtonTypeCustom adalah label yang dapat diklik jika Anda tidak menetapkan gambar untuk itu.
sumber
(Jawaban saya didasarkan pada jawaban luar biasa @ NAlexN . Saya tidak akan menduplikasi penjelasan terperinci dari setiap langkah di sini.)
Saya merasa paling mudah dan mudah untuk menambahkan dukungan untuk teks UILabel yang dapat mengetuk sebagai kategori untuk UITapGestureRecognizer. (Anda tidak harus menggunakan detektor data UITextView, seperti beberapa jawaban sarankan.)
Tambahkan metode berikut ke kategori UITapGestureRecognizer Anda:
Kode Contoh
Gesture Callback
sumber
plainText.length
.UITapGestureRecognizer
. Berikut adalah beberapa info tentang menambahkan kategori.UITextView
mendukung pendeteksi data di OS3.0, sedangkanUILabel
tidak.Jika Anda mengaktifkan pendeteksi data di
UITextView
dan teks Anda berisi URL, nomor telepon, dll. Mereka akan muncul sebagai tautan.sumber
hashtag://
atau sesuatu, lalu gunakantextView(_:shouldInteractWith:in:interaction:)
untuk mendeteksinya. Lihat jawaban di bawah ini: stackoverflow.com/a/34014655/1161906Menerjemahkan Ekstensi @ samwize ke Swift 4:
Untuk mengatur pengenal (setelah Anda mewarnai teks dan barang-barang):
... lalu pengenal isyarat:
sumber
didTapAttributedTextInLabel
membutuhkanNSRange
argumen tetapirangeTerms
mengembalikan sesuatu yang berbeda. JugahandleTapOnLabel
fungsi harus ditandai dengan@objc
dalam Swift 4.Seperti yang saya sebutkan di posting ini , berikut adalah perpustakaan berbobot ringan yang saya buat khusus untuk tautan di UILabel FRHyperLabel .
Untuk mencapai efek seperti ini:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque quis blandit eros, sit amet vehicula justo. Nam at urna neque. Anda dapat menggunakan porta dictum nec vel tellus.
gunakan kode:
sumber
Saya membuat subkelas UILabel bernama ResponsiveLabel yang didasarkan pada textkit API yang diperkenalkan di iOS 7. Menggunakan pendekatan yang sama seperti yang disarankan oleh NAlexN . Ini memberikan fleksibilitas untuk menentukan pola pencarian dalam teks. Orang dapat menentukan gaya yang akan diterapkan pada pola-pola tersebut serta tindakan yang akan dilakukan pada mengetuk pola.
Jika Anda ingin membuat string dapat diklik, Anda dapat melakukannya dengan cara ini. Kode ini menerapkan atribut untuk setiap kemunculan string "teks".
sumber
Bekerja di Swift 3, menempelkan seluruh kode di sini
sumber
Berikut ini contoh kode untuk hyperlink UILabel: Sumber: http://sickprogrammersarea.blogspot.in/2014/03/adding-links-to-uilabel.html
sumber
Ini adalah versi cepat dari jawaban NAlexN.
Anda kemudian dapat membuat instance kelas itu di dalam
viewDidLoad
metode Anda seperti ini:Lebih baik memiliki atribut khusus untuk digunakan ketika karakter diketuk. Sekarang, ini adalah
NSLinkAttributeName
, tetapi bisa berupa apa saja dan Anda dapat menggunakan nilai itu untuk melakukan hal lain selain membuka url, Anda dapat melakukan tindakan kustom apa pun.sumber
Saya mengalami kesulitan berurusan dengan ini ... UILabel dengan tautan di atasnya pada teks yang dikaitkan ... itu hanya sakit kepala jadi saya akhirnya menggunakan ZSWTappableLabel .
sumber
Seperti yang dilaporkan dalam jawaban sebelumnya, UITextView dapat menangani sentuhan pada tautan. Ini dapat dengan mudah diperpanjang dengan membuat bagian lain dari teks berfungsi sebagai tautan. Perpustakaan AttributedTextView adalah subkelas UITextView yang membuatnya sangat mudah untuk menangani ini. Untuk info lebih lanjut, lihat: https://github.com/evermeer/AttributedTextView
Anda dapat membuat bagian mana pun dari teks berinteraksi seperti ini (di mana textView1 adalah UITextView IBOutlet):
Dan untuk menangani tagar dan sebutan Anda dapat menggunakan kode seperti ini:
sumber
Saya memperluas jawaban @ samwize untuk menangani multi-line UILabel dan memberikan contoh tentang penggunaan untuk UIButton
sumber
Saya mengikuti versi ini,
Swift 4:
Contoh Panggilan:
sumber
Saya menemukan solusi lain:
Saya menemukan cara untuk mendeteksi tautan dalam teks html yang Anda temukan dari internet yang Anda ubah menjadi nsattributeString dengan:
Metode saya memungkinkan Anda mendeteksi hyperlink tanpa harus menentukannya.
pertama-tama Anda membuat ekstensi dari tapgesturerecognizer:
}
kemudian pada controller view Anda, Anda membuat daftar url dan rentang untuk menyimpan semua tautan dan rentang yang mengandung teks atribut:
untuk menemukan URL dan URLRange yang dapat Anda gunakan:
maka Anda menerapkan pegangan tap:
dan di sini kita pergi!
Saya harap solusi ini membantu Anda menyukainya.
sumber
Untuk tautan khusus sepenuhnya, Anda harus menggunakan UIWebView - Anda dapat mencegat panggilan keluar, sehingga Anda dapat pergi ke bagian lain dari aplikasi Anda saat tautan ditekan.
sumber
Berikut ini adalah kategori Objective-C drop-in yang memungkinkan tautan yang dapat diklik di
UILabel.attributedText
string yang ada , mengeksploitasiNSLinkAttributeName
atribut yang ada .Ini akan menjadi sedikit lebih bersih dilakukan melalui subkelas UILabel (yaitu tidak ada kekacauan objc_getAssociatedObject), tetapi jika Anda seperti saya, Anda lebih suka menghindari keharusan membuat subkelas (pihak ke-3) yang tidak perlu hanya untuk menambahkan beberapa fungsi tambahan ke kelas UIKit yang ada. Juga, ini memiliki keindahan yang ditambahkan tautan yang dapat diklik ke setiap UILabel yang ada, misalnya ada
UITableViewCells
!Saya sudah mencoba membuatnya seminimal mungkin dengan menggunakan hal-
NSLinkAttributeName
hal atribut yang sudah ada di NSAttributedString. Jadi sesederhana itu:Pada dasarnya, ini berfungsi dengan menambahkan a
UIGestureRecognizer
ke UILabel Anda. Kerja keras dilakukan dalamgestureRecognizerShouldBegin:
, yang menata ulang string attributedText untuk mengetahui karakter mana yang disadap. Jika karakter ini adalah bagian dari NSLinkAttributeName maka gestureRecognizer selanjutnya akan diaktifkan, mengambil URL yang sesuai (dari nilai NSLinkAttributeName), dan buka tautan per[UIApplication.sharedApplication openURL:url]
proses yang biasa .Catatan - dengan melakukan semua ini
gestureRecognizerShouldBegin:
, jika Anda tidak mengetuk tautan di label, acara akan diteruskan. Jadi, misalnya, UITableViewCell Anda akan menangkap keran pada tautan, tetapi sebaliknya berperilaku normal (pilih sel, batalkan pilihan, gulir, ...).Saya telah menempatkan ini di repositori GitHub di sini . Diadaptasi dari posting SO Kai Burghardt di sini .
sumber
Buat kelas dengan file .h dan .m berikut. Dalam file .m ada fungsi berikut
Di dalam fungsi ini kita akan memeriksa rentang substring yang perlu kita beri tindakan. Gunakan logika Anda sendiri untuk meletakkan rentang Anda.
Dan berikut ini adalah penggunaan subclass
berikut ini adalah file .h
berikut ini adalah file .m
sumber
Saya sangat merekomendasikan menggunakan perpustakaan yang secara otomatis mendeteksi URL dalam teks dan mengubahnya menjadi tautan. Mencoba:
Keduanya di bawah lisensi MIT.
sumber
berdasarkan jawaban Charles Gamble, inilah yang saya gunakan (saya menghapus beberapa baris yang membingungkan saya dan memberi saya indeks yang salah):
sumber
Solusi drop-in sebagai kategori aktif
UILabel
(ini mengasumsikan AndaUILabel
menggunakan string yang dikaitkan dengan beberapaNSLinkAttributeName
atribut di dalamnya):sumber
Berikut ini adalah implementasi Swift yang seminimal mungkin yang juga mencakup umpan balik sentuhan. Peringatan:
"\u{a0}"
).link
kunci.
sumber
Metode generik ini juga berfungsi!
Dan Anda dapat memanggil metode dengan
sumber
UITapGestureRecognizer
asalnya? Apakah ini outlet? Properti yang Anda siapkan?Berikut adalah jawaban saya berdasarkan @Luca Davanzo ini jawabannya , menimpa
touchesBegan
acara bukan sikap tap:sumber
TAGS # Swift2.0
Saya mengambil inspirasi pada - sangat baik - @ NAlexN jawaban dan saya memutuskan untuk menulis sendiri bungkus UILabel.
Saya juga mencoba TTTAttributedLabel tetapi saya tidak bisa membuatnya bekerja.
Semoga Anda bisa menghargai kode ini, saran dipersilahkan!
sumber
0
penyebab yanglocationOfTouchInTextContainer.x
negatif. Saya mencoba menggunakanlet indexOfCharacter = layoutManager.glyphIndex(for: locationOfTouch, in: textContainer)
sebagai gantinya, dan bekerja dengan baik.sumber
Kode @timbroder yang dimodifikasi untuk menangani beberapa baris dengan benar untuk swift4.2
Kode UILabel
Kode untuk mengenali Tap
sumber
Ini adalah implementasi Xamarin.iOS c # berdasarkan jawaban Kedar .
Implementasi MyClickableTextViewWithCustomUrlScheme dengan
ShouldInteractWithUrl
menimpa:Kode objektif-C yang dikonversi dalam c # menjadi:
Pastikan untuk mengatur Editable = false dan Selectable = true untuk dapat mengklik tautan.
ScrollEnabled = true juga memungkinkan tampilan teks untuk mengukur ketinggiannya dengan benar.
sumber