Jawaban ini telah diperbarui untuk Swift 4.2.
Referensi cepat
Bentuk umum untuk membuat dan mengatur string yang dikaitkan adalah seperti ini. Anda dapat menemukan opsi umum lainnya di bawah ini.
// create attributed string
let myString = "Swift Attributed String"
let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]
let myAttrString = NSAttributedString(string: myString, attributes: myAttribute)
// set attributed text on a UILabel
myLabel.attributedText = myAttrString
let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]
let myAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myAttribute = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue ]
let myShadow = NSShadow()
myShadow.shadowBlurRadius = 3
myShadow.shadowOffset = CGSize(width: 3, height: 3)
myShadow.shadowColor = UIColor.gray
let myAttribute = [ NSAttributedString.Key.shadow: myShadow ]
Sisa dari posting ini memberikan lebih banyak detail bagi mereka yang tertarik.
Atribut
Atribut string hanyalah kamus dalam bentuk [NSAttributedString.Key: Any]
, di mana NSAttributedString.Key
nama kunci atribut dan Any
merupakan nilai dari beberapa Tipe. Nilai bisa berupa font, warna, integer, atau yang lainnya. Ada banyak atribut standar di Swift yang telah ditentukan sebelumnya. Sebagai contoh:
- nama kunci:,
NSAttributedString.Key.font
nilai: aUIFont
- nama kunci:,
NSAttributedString.Key.foregroundColor
nilai: aUIColor
- nama kunci:,
NSAttributedString.Key.link
nilai: an NSURL
atauNSString
Ada banyak lainnya. Lihat tautan ini untuk lebih lanjut. Anda bahkan dapat membuat atribut khusus Anda sendiri seperti:
nama kunci:, NSAttributedString.Key.myName
nilai: beberapa Jenis.
jika Anda membuat ekstensi :
extension NSAttributedString.Key {
static let myName = NSAttributedString.Key(rawValue: "myCustomAttributeKey")
}
Membuat atribut di Swift
Anda dapat mendeklarasikan atribut seperti halnya mendeklarasikan kamus lainnya.
// single attributes declared one at a time
let singleAttribute1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let singleAttribute2 = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
let singleAttribute3 = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]
// multiple attributes declared at once
let multipleAttributes: [NSAttributedString.Key : Any] = [
NSAttributedString.Key.foregroundColor: UIColor.green,
NSAttributedString.Key.backgroundColor: UIColor.yellow,
NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]
// custom attribute
let customAttribute = [ NSAttributedString.Key.myName: "Some value" ]
Perhatikan rawValue
bahwa itu diperlukan untuk nilai gaya garis bawah.
Karena atribut hanyalah Kamus, Anda juga dapat membuatnya dengan membuat Kamus kosong dan kemudian menambahkan pasangan nilai kunci ke dalamnya. Jika nilainya akan berisi banyak jenis, maka Anda harus menggunakan Any
sebagai jenisnya. Berikut adalah multipleAttributes
contoh dari atas, dibuat ulang dengan cara ini:
var multipleAttributes = [NSAttributedString.Key : Any]()
multipleAttributes[NSAttributedString.Key.foregroundColor] = UIColor.green
multipleAttributes[NSAttributedString.Key.backgroundColor] = UIColor.yellow
multipleAttributes[NSAttributedString.Key.underlineStyle] = NSUnderlineStyle.double.rawValue
String yang dikaitkan
Sekarang setelah Anda memahami atribut, Anda dapat membuat string yang dikaitkan.
Inisialisasi
Ada beberapa cara untuk membuat string yang dikaitkan. Jika Anda hanya membutuhkan string read-only yang dapat Anda gunakan NSAttributedString
. Berikut ini beberapa cara untuk menginisialisasi:
// Initialize with a string only
let attrString1 = NSAttributedString(string: "Hello.")
// Initialize with a string and inline attribute(s)
let attrString2 = NSAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])
// Initialize with a string and separately declared attribute(s)
let myAttributes1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let attrString3 = NSAttributedString(string: "Hello.", attributes: myAttributes1)
Jika nanti Anda perlu mengubah atribut atau konten string, Anda harus menggunakannya NSMutableAttributedString
. Deklarasi sangat mirip:
// Create a blank attributed string
let mutableAttrString1 = NSMutableAttributedString()
// Initialize with a string only
let mutableAttrString2 = NSMutableAttributedString(string: "Hello.")
// Initialize with a string and inline attribute(s)
let mutableAttrString3 = NSMutableAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])
// Initialize with a string and separately declared attribute(s)
let myAttributes2 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let mutableAttrString4 = NSMutableAttributedString(string: "Hello.", attributes: myAttributes2)
Mengubah String yang Dikaitkan
Sebagai contoh, mari kita buat string yang dikaitkan di bagian atas posting ini.
Pertama buat NSMutableAttributedString
dengan atribut font baru.
let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myString = NSMutableAttributedString(string: "Swift", attributes: myAttribute )
Jika Anda bekerja bersama, setel string yang dikaitkan dengan UITextView
(atau UILabel
) seperti ini:
textView.attributedText = myString
Anda tidak menggunakan textView.text
.
Inilah hasilnya:
Kemudian tambahkan string terkait lainnya yang tidak memiliki set atribut apa pun. (Perhatikan bahwa meskipun saya pernah let
menyatakan di myString
atas, saya masih dapat memodifikasinya karena itu adalah NSMutableAttributedString
. Ini sepertinya tidak disukai bagi saya dan saya tidak akan terkejut jika ini berubah di masa depan. Beri saya komentar ketika itu terjadi.)
let attrString = NSAttributedString(string: " Attributed Strings")
myString.append(attrString)
Selanjutnya kita hanya akan memilih kata "Strings", yang dimulai pada indeks 17
dan memiliki panjang 7
. Perhatikan bahwa ini adalah NSRange
dan bukan Swift Range
. (Lihat jawaban ini untuk informasi lebih lanjut tentang Rentang.) addAttribute
Metode ini memungkinkan kita meletakkan nama kunci atribut di tempat pertama, nilai atribut di tempat kedua, dan rentang di tempat ketiga.
var myRange = NSRange(location: 17, length: 7) // range starting at location 17 with a lenth of 7: "Strings"
myString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red, range: myRange)
Akhirnya, mari kita tambahkan warna latar belakang. Untuk variasi, mari gunakan addAttributes
metode ini (perhatikan s
). Saya bisa menambahkan beberapa atribut sekaligus dengan metode ini, tetapi saya hanya akan menambahkan satu lagi.
myRange = NSRange(location: 3, length: 17)
let anotherAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
myString.addAttributes(anotherAttribute, range: myRange)
Perhatikan bahwa atributnya tumpang tindih di beberapa tempat. Menambahkan atribut tidak menimpa atribut yang sudah ada di sana.
Terkait
Bacaan lebih lanjut
NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue | NSUnderlineStyle.PatternDot.rawValue
textView.atrributedtText = myString
ataumyLabel.attributedText = myString
di awal jawaban Anda. Sebagai seorang pemula saya hanya melakukanmyLabel.text
dan tidak berpikir saya perlu melewati semua jawaban Anda. ** 3) ** Apakah ini berarti bahwa Anda hanya dapat memiliki salah satuattributedText
atautext
memiliki keduanya tidak akan berarti? 4) Saya sarankan Anda juga memasukkanlineSpacing
contoh seperti ini dalam jawaban Anda karena sangat berguna. 5) ачаар дахинappendAttributedString
seperti 'string concatenation'.addAttribute
menambahkan atribut baru ke string Anda.addAttribute
adalah metodeNSMutableAttributedString
. Anda benar bahwa Anda tidak dapat menggunakannya denganString
atauNSAttributedString
. (PeriksamyString
definisi di bagian Mengubah String yang Ditautkan dari pos ini. Saya rasa saya mengusir Anda karena saya juga menggunakanmyString
untuk nama variabel di bagian pertama dari pos di mana ia beradaNSAttributedString
.)Swift menggunakan hal yang sama seperti
NSMutableAttributedString
yang dilakukan Obj-C. Anda instantiate dengan meneruskan nilai yang dihitung sebagai string:Sekarang buat
g
string yang dikaitkan (heh). Catatan:UIFont.systemFontOfSize(_)
sekarang merupakan inisialisasi yang tersedia, sehingga harus dibuka sebelum Anda dapat menggunakannya:Dan kemudian menambahkannya:
Anda kemudian dapat mengatur UILabel untuk menampilkan NSAttributedString seperti ini:
sumber
//Part 1 Set Up The Lower Case g var coffeeText = NSMutableAttributedString(string:"\(calculateCoffee())") //Part 2 set the font attributes for the lower case g var coffeeTypeFaceAttributes = [NSFontAttributeName : UIFont.systemFontOfSize(18)] //Part 3 create the "g" character and give it the attributes var coffeeG = NSMutableAttributedString(string:"g", attributes:coffeeTypeFaceAttributes)
Ketika saya mengatur UILabel.text = coffeeText saya mendapatkan kesalahan "NSMutableAttributedString tidak dapat dikonversi ke 'String'. Apakah ada cara untuk membuat UILabel menerima NSMutableAttributedString?Versi Xcode 6 :
Versi Xcode 9.3 :
Xcode 10, iOS 12, Swift 4 :
sumber
Swift 4:
sumber
Type 'NSAttributedStringKey' (aka 'NSString') has no member 'font'
Saya akan sangat merekomendasikan menggunakan perpustakaan untuk string yang dikaitkan. Ini membuatnya lebih mudah ketika Anda ingin, misalnya, satu string dengan empat warna berbeda dan empat font berbeda. Ini favorit saya. Ini disebut SwiftyAttributes
Jika Anda ingin membuat string dengan empat warna dan font berbeda menggunakan SwiftyAttributes:
finalString
akan ditampilkan sebagaisumber
Swift: xcode 6.1
sumber
Cara terbaik untuk mendekati Attributed Strings di iOS adalah dengan menggunakan built-in Attributed Text editor di pembuat antarmuka dan menghindari hardcoding NSAtrributedStringKeys yang tidak diperlukan dalam file sumber Anda.
Anda nanti dapat secara dinamis mengganti placehoderls saat runtime dengan menggunakan ekstensi ini:
Tambahkan label papan cerita dengan teks yang dikaitkan tampak seperti ini.
Maka Anda cukup memperbarui nilai setiap kali Anda perlu seperti ini:
Pastikan untuk menyimpan ke initalAttributedString nilai asli.
Anda dapat lebih memahami pendekatan ini dengan membaca artikel ini: https://medium.com/mobile-appetite/text-attributes-on-ios-the-effortless-approach-ff086588173e
sumber
let nsRange = NSRange(range,in:valueString)
.Swift 2.0
Berikut ini contohnya:
Swift 5.x
ATAU
sumber
Bekerja dengan baik di beta 6
sumber
Saya membuat alat online yang akan menyelesaikan masalah Anda! Anda dapat menulis string dan menerapkan gaya grafis dan alat memberi Anda kode obyektif-c dan cepat untuk menghasilkan string itu.
Juga merupakan open source, jadi jangan ragu untuk memperpanjang dan mengirim PR.
Alat Transformer
Github
sumber
Cepat 5 dan lebih tinggi
sumber
//Penerapan
sumber
Cepat 4
Anda harus menghapus nilai mentah di swift 4
sumber
Bagi saya solusi di atas tidak berfungsi saat mengatur warna atau properti tertentu.
Ini berhasil:
sumber
Swift 2.1 - Xcode 7
sumber
Gunakan kode contoh ini. Ini adalah kode yang sangat singkat untuk mencapai kebutuhan Anda. Ini bekerja untuk saya.
sumber
sumber
Atribut dapat diatur langsung dalam 3 ...
Kemudian gunakan variabel di kelas apa pun dengan atribut
sumber
Cepat 4.2
sumber
Detail
Larutan
Pemakaian
Contoh Lengkap
Hasil
sumber
Akan sangat mudah untuk menyelesaikan masalah Anda dengan perpustakaan yang saya buat. Itu disebut Atributika.
Anda dapat menemukannya di sini https://github.com/psharanda/Atributika
sumber
sumber
Swifter Swift memiliki cara yang cukup manis untuk melakukan ini tanpa pekerjaan apa pun. Berikan saja pola yang harus dicocokkan dan atribut apa yang berlaku untuk itu. Mereka hebat untuk banyak hal memeriksanya.
Jika Anda memiliki banyak tempat di mana ini akan diterapkan dan Anda hanya ingin itu terjadi untuk contoh tertentu maka metode ini tidak akan berfungsi.
Anda dapat melakukan ini dalam satu langkah, hanya lebih mudah dibaca ketika dipisahkan.
sumber
Swift 4.x
sumber
Swift 3.0 // membuat string yang dikaitkan
Tentukan atribut like
sumber
Silakan pertimbangkan menggunakan Prestyler
sumber
Cepat 5
sumber
}
// Gunakan seperti di bawah ini
sumber