Yang saya inginkan hanyalah batas hitam satu piksel di sekitar teks UILabel putih saya.
Saya sampai pada subclassing UILabel dengan kode di bawah ini, yang dengan kikuk saya susun dari beberapa contoh online yang berhubungan secara tangensial. Dan itu berhasil tetapi sangat, sangat lambat (kecuali di simulator) dan saya juga tidak bisa membuatnya memusatkan teks secara vertikal (jadi saya melakukan hardcode nilai y pada baris terakhir untuk sementara). Ahhhh!
void ShowStringCentered(CGContextRef gc, float x, float y, const char *str) {
CGContextSetTextDrawingMode(gc, kCGTextInvisible);
CGContextShowTextAtPoint(gc, 0, 0, str, strlen(str));
CGPoint pt = CGContextGetTextPosition(gc);
CGContextSetTextDrawingMode(gc, kCGTextFillStroke);
CGContextShowTextAtPoint(gc, x - pt.x / 2, y, str, strlen(str));
}
- (void)drawRect:(CGRect)rect{
CGContextRef theContext = UIGraphicsGetCurrentContext();
CGRect viewBounds = self.bounds;
CGContextTranslateCTM(theContext, 0, viewBounds.size.height);
CGContextScaleCTM(theContext, 1, -1);
CGContextSelectFont (theContext, "Helvetica", viewBounds.size.height, kCGEncodingMacRoman);
CGContextSetRGBFillColor (theContext, 1, 1, 1, 1);
CGContextSetRGBStrokeColor (theContext, 0, 0, 0, 1);
CGContextSetLineWidth(theContext, 1.0);
ShowStringCentered(theContext, rect.size.width / 2.0, 12, [[self text] cStringUsingEncoding:NSASCIIStringEncoding]);
}
Saya hanya memiliki perasaan yang mengganggu bahwa saya mengabaikan cara yang lebih sederhana untuk melakukan ini. Mungkin dengan menimpa "drawTextInRect", tapi sepertinya saya tidak bisa membuat drawTextInRect tunduk pada keinginan saya sama sekali meskipun menatapnya dengan saksama dan mengerutkan kening sangat keras.
sumber
Jawaban:
Saya bisa melakukannya dengan mengganti drawTextInRect:
sumber
UILabel
dan-drawTextInRect:
menerapkan implementasinya di sana.Solusi yang lebih sederhana adalah dengan menggunakan Attributed String seperti ini:
Cepat 4:
Swift 4.2:
Di a
UITextField
Anda dapat mengaturdefaultTextAttributes
danattributedPlaceholder
juga.Perhatikan bahwa dalam kasus ini
NSStrokeWidthAttributeName
harus negatif , yaitu hanya garis dalam yang bekerja.sumber
Setelah membaca jawaban yang diterima dan dua koreksi dan jawaban dari Axel Guilmin, saya memutuskan untuk mengumpulkan solusi keseluruhan di Swift, yang cocok untuk saya:
Anda dapat menambahkan kelas UILabel kustom ini ke label yang ada di Interface Builder dan mengubah ketebalan batas dan warnanya dengan menambahkan Atribut Waktu Proses yang Ditentukan Pengguna seperti ini:
Hasil:
sumber
Ada satu masalah dengan implementasi jawabannya. Menggambar teks dengan guratan memiliki lebar mesin terbang karakter yang sedikit berbeda daripada menggambar teks tanpa guratan, yang bisa menghasilkan hasil "tidak terpusat". Itu bisa diperbaiki dengan menambahkan goresan tak terlihat di sekitar teks isian.
Menggantikan:
dengan:
Saya tidak 100% yakin, apakah itu real deal, karena saya tidak tahu apakah
self.textColor = textColor;
memiliki efek yang sama[textColor setFill]
, tetapi itu akan berhasil.Pengungkapan: Saya pengembang THLabel.
Saya telah merilis subclass UILabel beberapa waktu lalu, yang memungkinkan garis besar dalam teks dan efek lainnya. Anda dapat menemukannya di sini: https://github.com/tobihagemann/THLabel
sumber
Ini tidak akan membuat garis luar saja, tetapi itu akan membuat bayangan di sekitar teks, dan jika Anda membuat radius bayangan cukup kecil itu bisa menyerupai garis besar.
Saya tidak tahu apakah itu kompatibel dengan versi iOS yang lebih lama ..
Bagaimanapun, saya harap ini membantu ...
sumber
Versi kelas Swift 4 berdasarkan jawaban oleh kprevas
Ini dapat diimplementasikan sepenuhnya di Interface Builder dengan menyetel kelas khusus UILabel ke OutlinedText. Anda kemudian akan memiliki kemampuan untuk mengatur lebar garis dan warna dari panel Properties.
sumber
Jika Anda ingin menganimasikan sesuatu yang rumit, cara terbaik adalah dengan mengambil tangkapan layar secara terprogram dan menganimasikannya!
Untuk mengambil tangkapan layar tampilan, Anda memerlukan kode seperti ini:
Di mana mainContentView adalah tampilan yang ingin Anda ambil tangkapan layarnya. Tambahkan viewImage ke UIImageView dan animasikan itu.
Semoga mempercepat animasi Anda !!
N
sumber
Seperti yang disebutkan MuscleRumble , batas jawaban yang diterima agak jauh dari tengah. Saya bisa memperbaiki ini dengan mengatur lebar goresan ke nol alih-alih mengubah warna menjadi jelas.
yaitu mengganti:
dengan:
Saya hanya akan mengomentari jawabannya tetapi tampaknya saya tidak cukup "memiliki reputasi".
sumber
jika SEMUA yang Anda inginkan adalah batas hitam satu piksel di sekitar teks UILabel putih saya,
maka saya pikir Anda membuat masalah lebih sulit daripada itu ... Saya tidak tahu dengan memori mana fungsi 'draw rect / frameRect' yang harus Anda gunakan, tetapi akan mudah bagi Anda untuk menemukannya. metode ini hanya mendemonstrasikan strateginya (biarkan superclass yang bekerja!):
sumber
Saya menemukan masalah dengan jawaban utama. Posisi teks tidak selalu tepat berada di tengah ke lokasi sub-piksel, sehingga garis tepi dapat menjadi tidak cocok di sekitar teks. Saya memperbaikinya menggunakan kode berikut, yang menggunakan
CGContextSetShouldSubpixelQuantizeFonts(ctx, false)
:Ini mengasumsikan bahwa Anda mendefinisikan
textOutlineColor
dantextOutlineWidth
sebagai properti.sumber
Berikut adalah jawaban lain untuk menguraikan teks yang diuraikan pada label.
setel teks yang diuraikan hanya dengan menggunakan metode ekstensi.
sumber
juga dimungkinkan untuk membuat subclass UILabel dengan logika berikut:
dan jika Anda mengatur teks di Storyboard maka:
sumber
Jika tujuan Anda adalah seperti ini:
Berikut adalah cara saya mencapainya: Saya menambahkan kelas baru
label
khusus sebagai Subview ke UILabel saya saat ini (terinspirasi oleh jawaban ini ).Cukup salin & tempel ke proyek Anda dan Anda siap melakukannya:
PEMAKAIAN:
itu juga berfungsi untuk a
UIButton
dengan semua animasinya:sumber
Mengapa Anda tidak membuat UIView perbatasan 1px di Photoshop, lalu mengatur UIView dengan gambar, dan memposisikannya di belakang UILabel Anda?
Kode:
Ini akan menyelamatkan Anda dari subclass objek dan itu cukup mudah dilakukan.
Belum lagi jika Anda ingin membuat animasi, itu dibangun ke dalam kelas UIView.
sumber
Untuk meletakkan perbatasan dengan tepi bulat di sekitar UILabel saya melakukan hal berikut:
(jangan lupa untuk menyertakan QuartzCore / QuartzCore.h)
sumber