Jawaban:
Anda perlu menggunakan layer view untuk mengatur properti border. misalnya:
#import <QuartzCore/QuartzCore.h>
...
view.layer.borderColor = [UIColor redColor].CGColor;
view.layer.borderWidth = 3.0f;
Anda juga perlu menautkan dengan QuartzCore.framework untuk mengakses fungsi ini.
__bridge CGColorRef
. Ini tidak bekerja. Itu perlu [UIColor blackColor].CGColor
seperti yang disebutkan dalam jawaban.
#import <QuartzCore/QuartzCore.h>
tidak lagi dibutuhkan.
Karena versi terbaru Xcode ada solusi yang lebih baik untuk ini:
Dengan @IBInspectable
Anda dapat mengatur Atribut langsung dari dalam yang Attributes Inspector
.
Ini menentukan User Defined Runtime Attributes
untuk Anda:
Ada dua pendekatan untuk mengatur ini:
Opsi 1 (dengan pembaruan langsung di Storyboard)
MyCustomView
.UIView
.@IBDesignable
(ini membuat Lihat pembaruan hidup). *@IBInspectable
MyCustomView
`
@IBDesignable
class MyCustomView: UIView {
@IBInspectable var cornerRadius: CGFloat = 0 {
didSet {
layer.cornerRadius = cornerRadius
layer.masksToBounds = cornerRadius > 0
}
}
@IBInspectable var borderWidth: CGFloat = 0 {
didSet {
layer.borderWidth = borderWidth
}
}
@IBInspectable var borderColor: UIColor? {
didSet {
layer.borderColor = borderColor?.CGColor
}
}
}
* @IBDesignable
Hanya berfungsi bila diset pada awalclass MyCustomView
Opsi 2 (tidak berfungsi sejak Swift 1.2, lihat komentar)
Perpanjang Kelas UIView Anda:
extension UIView {
@IBInspectable var cornerRadius: CGFloat = 0 {
didSet {
layer.cornerRadius = cornerRadius
layer.masksToBounds = cornerRadius > 0
}
}
@IBInspectable var borderWidth: CGFloat = 0 {
didSet {
layer.borderWidth = borderWidth
}
}
@IBInspectable var borderColor: UIColor? {
didSet {
layer.borderColor = borderColor?.CGColor
}
}
}
Dengan cara ini, Tampilan default Anda selalu memiliki bidang tambahan yang dapat diedit Attributes Inspector
. Keuntungan lain adalah Anda tidak perlu mengubah kelas MycustomView
setiap saat. Namun, satu kelemahannya adalah Anda hanya akan melihat perubahan saat menjalankan aplikasi.
Anda juga dapat membuat batas dengan warna keinginan Anda ..
view.layer.borderColor = [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0].CGColor;
* r, g, b adalah nilai antara 0 hingga 255.
Tambahkan @IBInspectables berikut dalam ekstensi UIView
extension UIView {
@IBInspectable var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set(newValue) {
layer.borderWidth = newValue
}
}
@IBInspectable var borderColor: UIColor? {
get {
if let color = layer.borderColor {
return UIColor(CGColor: color)
}
return nil
}
set(newValue) {
layer.borderColor = newValue?.CGColor
}
}
}
Dan kemudian Anda harus dapat mengatur atribut borderColor dan borderWidth langsung dari inspektur Atribut. Lihat gambar terlampir
Ketika saya menggunakan solusi CALayer dari Vladimir, dan di atas tampilan saya memiliki animasi, seperti modal UINavigationController yang ditolak, saya melihat banyak gangguan yang terjadi dan memiliki masalah kinerja gambar.
Jadi, cara lain untuk mencapai ini, tetapi tanpa gangguan dan kehilangan kinerja, adalah dengan membuat UIView khusus dan mengimplementasikan drawRect
pesan seperti:
- (void)drawRect:(CGRect)rect
{
CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(contextRef, 1);
CGContextSetRGBStrokeColor(contextRef, 255.0, 255.0, 255.0, 1.0);
CGContextStrokeRect(contextRef, rect);
}
setNeedsDisplay
tampilan. Ini akan memaksa redraw UIView dan secara implisit akan menelepon kembali drawRect
. Tidak diuji, tho ...
view.layer.borderWidth = 1.0
view.layer.borderColor = UIColor.lightGray.cgColor
Coba kode ini:
view.layer.borderColor = [UIColor redColor].CGColor;
view.layer.borderWidth= 2.0;
[view setClipsToBounds:YES];
Saya tidak akan menyarankan mengganti drawRect karena menyebabkan hit kinerja.
Sebagai gantinya, saya akan memodifikasi properti kelas seperti di bawah ini (di uiview khusus Anda):
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.layer.borderWidth = 2.f;
self.layer.borderColor = [UIColor redColor].CGColor;
}
return self;
Saya tidak melihat gangguan ketika mengambil pendekatan di atas - tidak yakin mengapa menempatkan initWithFrame menghentikan ini ;-)
Saya ingin menambahkan ini ke jawaban @ marczking ( Opsi 1 ) sebagai komentar, tetapi status rendah saya di StackOverflow mencegahnya.
Saya melakukan port jawaban @ marczking untuk Objective C. Bekerja seperti pesona, terima kasih @marczking!
UIView + Border.h:
#import <UIKit/UIKit.h>
IB_DESIGNABLE
@interface UIView (Border)
-(void)setBorderColor:(UIColor *)color;
-(void)setBorderWidth:(CGFloat)width;
-(void)setCornerRadius:(CGFloat)radius;
@end
UIView + Border.m:
#import "UIView+Border.h"
@implementation UIView (Border)
// Note: cannot use synthesize in a Category
-(void)setBorderColor:(UIColor *)color
{
self.layer.borderColor = color.CGColor;
}
-(void)setBorderWidth:(CGFloat)width
{
self.layer.borderWidth = width;
}
-(void)setCornerRadius:(CGFloat)radius
{
self.layer.cornerRadius = radius;
self.layer.masksToBounds = radius > 0;
}
@end
@IBInspectable bekerja untuk saya di iOS 9, Swift 2.0
extension UIView {
@IBInspectable var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set(newValue) {
layer.borderWidth = newValue
}
}
@IBInspectable var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set(newValue) {
layer.cornerRadius = newValue
}
}
@IBInspectable var borderColor: UIColor? {
get {
if let color = layer.borderColor {
return UIColor(CGColor: color)
}
return nil
}
set(newValue) {
layer.borderColor = newValue?.CGColor
}
}
Jika Anda tidak ingin mengedit lapisan UIView, Anda selalu dapat menyematkan tampilan dalam tampilan lain. Tampilan induk akan mengatur warna latar belakang ke warna batas. Ini juga akan sedikit lebih besar, tergantung pada seberapa lebar Anda ingin menjadi perbatasan.
Tentu saja, ini hanya berfungsi jika tampilan Anda tidak transparan dan Anda hanya ingin warna garis tunggal. OP ingin perbatasan dalam pandangan itu sendiri, tetapi ini mungkin merupakan alternatif yang layak.
Jika Anda ingin menambahkan batas yang berbeda di sisi yang berbeda, mungkin menambahkan subview dengan gaya spesifik adalah cara yang mudah dibuat.