Saya ingin menambahkan NSTextAttachment
gambar ke string atribut saya dan membuatnya berada di tengah secara vertikal.
Saya telah menggunakan kode berikut untuk membuat string saya:
NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:DDLocalizedString(@"title.upcomingHotspots") attributes:attrs];
NSTextAttachment *attachment = [[NSTextAttachment alloc] init];
attachment.image = [[UIImage imageNamed:@"help.png"] imageScaledToFitSize:CGSizeMake(14.f, 14.f)];
cell.textLabel.attributedText = [str copy];
Namun, gambar tampak sejajar dengan bagian atas sel textLabel
.
Bagaimana saya bisa mengubah persegi di mana lampiran digambar?
ios
objective-c
swift
uilabel
nstextattachment
Sean Danzeiser
sumber
sumber
Jawaban:
Anda dapat mengubah rect dengan subclassing
NSTextAttachment
dan overridingattachmentBoundsForTextContainer:proposedLineFragment:glyphPosition:characterIndex:
. Contoh:Ini bukanlah solusi yang sempurna. Anda harus mencari tahu asal Y "dengan mata" dan jika Anda mengubah font atau ukuran ikon, Anda mungkin ingin mengubah Y-origin. Tetapi saya tidak dapat menemukan cara yang lebih baik, kecuali dengan meletakkan ikon dalam tampilan gambar terpisah (yang memiliki kekurangan).
sumber
Anda dapat menggunakan capHeight font.
Objective-C
Cepat
Gambar lampiran dirender pada garis dasar teks. Dan sumbu y dibalik seperti sistem koordinat grafik inti. Jika Anda ingin memindahkan gambar ke atas, setel
bounds.origin.y
ke positif.Gambar harus diratakan secara vertikal di tengah dengan capHeight teks. Jadi kita perlu menyetel
bounds.origin.y
ke(capHeight - imageHeight)/2
.Untuk menghindari beberapa efek bergerigi pada gambar, kita harus membulatkan bagian pecahan dari y. Tapi font dan gambar biasanya kecil, bahkan perbedaan 1px membuat gambar terlihat tidak sejajar. Jadi saya menerapkan fungsi bulat sebelum membagi. Itu membuat bagian pecahan dari nilai y menjadi 0,0 atau 0,5
Dalam kasus Anda, tinggi gambar lebih besar dari capHeight font. Tapi Anda bisa menggunakan cara yang sama. Nilai offset y akan menjadi negatif. Dan itu akan ditata dari bawah garis dasar.
sumber
Coba
- [NSTextAttachment bounds]
. Tidak diperlukan subclass.Untuk konteks, saya merender a
UILabel
untuk digunakan sebagai gambar lampiran, kemudian mengatur batas seperti ini:attachment.bounds = CGRectMake(0, self.font.descender, attachment.image.size.width, attachment.image.size.height)
dan garis dasar teks dalam gambar label dan teks dalam baris atribut yang diatribusikan sesuai keinginan.sumber
attachment.bounds = CGRect(x: 0.0, y: self.font.descender, width: attachment.image!.size.width, height: attachment.image!.size.height)
descender
properti UIFont!Saya menemukan solusi sempurna untuk ini, berfungsi seperti pesona bagi saya, namun Anda harus mencobanya sendiri (mungkin konstanta tergantung pada resolusi perangkat dan mungkin apa pun;)
Harus berfungsi dan tidak boleh buram dengan cara apa pun (terima kasih
CGRectIntegral
)sumber
Bagaimana dengan:
Tidak perlu subclass
sumber
@Travis benar bahwa offsetnya adalah font descender. Jika Anda juga perlu menskalakan gambar, Anda perlu menggunakan subclass NSTextAttachment. Di bawah ini adalah kode yang terinspirasi dari artikel ini . Saya juga mempostingnya sebagai intinya .
Gunakan sebagai berikut:
sumber
Jika Anda memiliki ascendent yang sangat besar dan ingin memusatkan gambar (pusat ketinggian topi) seperti saya coba ini
Perhitungan y seperti gambar di bawah ini
Perhatikan bahwa nilai y adalah 0 karena kita ingin gambar bergeser ke bawah dari aslinya
Jika Anda ingin berada di tengah seluruh label. Gunakan nilai y ini:
sumber
Kita bisa membuat ekstensi di swift 4 yang menghasilkan lampiran dengan gambar di tengah seperti ini:
Kemudian Anda dapat melakukan panggilan dengan mengirimkan nama gambar dan font:
Dan kemudian tambahkan imageAttachment ke atributedString
sumber
Dalam kasus saya, memanggil sizeToFit () membantu. Dalam 5.1 cepat
Di dalam label kustom Anda:
sumber
Harap gunakan -lineFrag.size.height / 5.0 untuk tinggi batas. Ini persis memusatkan gambar dan sejajar dengan teks untuk semua ukuran font
sumber
-lineFrag.size.height/5.0
tidak benar. Sebaliknya itu adalah font descender.