Untuk a UIScrollView *toScrollView
(yang merupakan lebar layar), saya ingin menambahkan batas bawah abu-abu (persis seperti pada bidang-bidang dari tampilan penulisan aplikasi Pesan asli iPhone).
Untuk mencapai ini, saya mengikuti Cocoa Touch: Bagaimana Mengganti Warna Dan Ketebalan Perbatasan UIView? dan hanya menutupi batas atas dengan kebiasaan UINavigationBar
dan membuat toScrollView
koordinat x -1 & lebar 322 sehingga batas kiri & kanan lepas layar.
Ini terlihat baik-baik saja, tapi ini semacam peretasan, dan saya bertanya-tanya apakah ada cara yang lebih baik untuk melakukan ini.
- (void)viewDidLoad {
[super viewDidLoad];
// Add UINavigationBar *navigationBar at top.
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
target:self action:@selector(cancelAction)];
UINavigationBar *navigationBar = [[UINavigationBar alloc]
initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 44.0f)];
navigationBar.items = [NSArray arrayWithObject:self.navigationItem];
// Add UIScrollView *toScrollView below navigationBar.
UIScrollView *toScrollView = [[UIScrollView alloc]
initWithFrame:CGRectMake(-1.0f, 43.0f, 322.0f, 45.0f)];
toScrollView.backgroundColor = [UIColor whiteColor];
toScrollView.layer.borderColor = [UIColor colorWithWhite:0.8f alpha:1.0f].CGColor;
toScrollView.layer.borderWidth = 1.0f;
[self.view addSubview:toScrollView];
[self.view addSubview:navigationBar]; // covers top of toScrollView
}
Jawaban:
Alih-alih menggunakan
UIView
, seperti yang disarankan oleh @ ImreKelényi, Anda dapat menggunakanCALayer
:sumber
QuartzCore framework
proyek Anda jika Anda tidak memilikinya karena Anda mungkin mendapatkan kesalahan kompiler.QuartzCore.framework
lagi.43.0f
ketoScrollView.frame.size.height
untuk memastikan itu di bagian bawahBerikut ini adalah ekstensi Swift yang lebih umum untuk membuat batas untuk setiap
UIView
subkelas:Cepat 3
sumber
border.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: width)
dll.Diimplementasikan dalam kategori seperti di bawah ini:
UIButton + Border.h:
UIButton + Perbatasan.m:
sumber
Cepat 4
Jika Anda membutuhkan solusi yang benar-benar adaptif (untuk semua ukuran layar), ini dia:
sumber
Anda dapat menambahkan terpisah
UIView
dengan ketinggian 1 titik dan warna latar belakang abu-abu keself.view
dan posisikan tepat di bawahtoScrollView
.sumber
Solusi untuk Swift 4
BackgroundColor lightGray. Ubah warna jika Anda perlu.
sumber
Ada juga kode yang ditingkatkan dengan menghapus fungsi perbatasan. Berdasarkan jawaban confile .
Pembaruan: Swift 3
sumber
func remove(border: ViewBorder) { layer.sublayers? .compactMap { $0 } .filter { $0.name == border.rawValue } .forEach { $0.removeFromSuperlayer() } }
Masalah dengan metode ekstensi ini adalah bahwa ketika UIView / UIButton kemudian menyesuaikan ukurannya, Anda tidak memiliki kesempatan untuk mengubah ukuran CALayer agar sesuai dengan ukuran baru. Yang akan membuat Anda dengan perbatasan salah tempat. Saya menemukan lebih baik untuk subkelas UIButton saya, Anda tentu saja dapat subkelas UIViews lain juga. Ini beberapa kode:
sumber
Atau, cara yang paling ramah-kinerja adalah dengan membebani drawRect, cukup seperti itu:
sumber
drawRect:
belum tentu ramah kinerja. Saya cukup yakin menggunakan layer memiliki kinerja yang jauh lebih baik.setFrame:
,setBounds:
ataulayoutSubviews
.layoutSublayersOfLayer:
daripadasetFrame:
atau yang lainJawaban Swile 3 versi jawaban:
Penggunaan saat menggunakan tata letak otomatis:
sumber
Jika Anda menggunakan batasan (dan karena itu tidak memiliki ukuran bingkai) maka Anda dapat menambahkan tampilan perbatasan dengan kendala yang diperlukan
Kemudian atur seperti di bawah ini
(terinspirasi oleh jawaban ini )
sumber
Cepat
Buat ekstensi UIView
Tujuan C
Buat kelas kategori UIView
UIView + Border.h
UIView + Border.m
Penggunaan: - Pilih kontrol apa saja dari storyboard, lalu tunjukkan inspektur atribut (Sisi kanan) Anda akan melihat contoh gambar di bawah ini (Catatan: Perbatasan hanya muncul pada saat run time.)
Sekarang Anda dapat mengatur sisi warna dan lebar perbatasan.
sumber
Saya menulis metode umum yang akan menambahkan batas pada sisi mana pun yang Anda inginkan
UIView
. Anda dapat menentukan ketebalan, warna, margin danzOrder
untuk setiap sisi.sumber
Anda tidak perlu menambahkan layer untuk setiap perbatasan, cukup gunakan jalur bezier untuk menggambar mereka sekali.
sumber
Swift 4/3
Anda dapat menggunakan solusi ini di bawah. Ia bekerja pada UIBezierPaths yang lebih ringan dari lapisan, menyebabkan waktu startup yang cepat. Mudah digunakan, lihat instruksi di bawah.
sumber
Cepat 4
Berdasarkan: https://stackoverflow.com/a/32821607/9980800
UIView + Border
}
Pemakaian:-
sumber
Cepat 4
Berdasarkan https://stackoverflow.com/a/32513578/5391914
sumber
Jawaban paling lengkap. https://github.com/oney/UIView-Border
sumber
Ekstensi Swift 4 dengan lebar dan warna tepi. Bagus sekali!
}
sumber
Cepat 5.1. Gunakan dengan dua ekstensi, metode pengembalian CALayer, jadi Anda akan menggunakannya kembali untuk memperbarui bingkai.
sumber
ekstensi UIView {
func addBottomLine (warna: UIColor, tinggi: CGFloat) {
}
}
sumber