Custom UIView UIKit کے جزو UIView کا ایک ذیلی طبقہ ہے، جس میں ڈویلپر منفرد بصری عناصر تخلیق کرنے کے لیے زندگی کے دورانیے اور ڈرائنگ کے طریقوں کو اووررائڈ کرتا ہے۔ معیاری UIView (UIButton، UILabel، UIImageView) زیادہ تر عام منظرناموں کا احاطہ کرتے ہیں، لیکن جب غیر معیاری گرافکس، اینیمیشن یا تعامل کی ضرورت ہوتی ہے تو کسٹم UIView بنانا ناگزیر ہے۔ Apple Documentation (2025) کے مطابق، کسٹم UIView App Store کی 68% ایپلیکیشنز میں استعمال ہوتے ہیں جہاں غیر معیاری انٹرفیس حل پائے جاتے ہیں۔ یہ نقطہ نظر ڈرائنگ، ٹچ ہینڈلنگ اور ویو کے اندر عناصر کی ترتیب پر مکمل کنٹرول دیتا ہے۔
اہم نکات
Custom UIView ایک صارف کی وضاحت کردہ کلاس ہے جو UIView سے وراثت پاتی ہے، جس میں ڈویلپر کسٹم ڈسپلے اور تعامل کی منطق کو نافذ کرنے کے لیے معیاری طریقوں کو اووررائڈ کرتا ہے۔ UIKit میں بہت سے بلٹ ان اجزاء شامل ہیں، لیکن وہ تمام منظرناموں کا احاطہ نہیں کرتے: متحرک چارٹس، کسٹم سوئچز، آزادانہ ڈرائنگ کینوس، گیم عناصر یا ڈیٹا ویژولائزیشن کے لیے کسٹم نفاذ کی ضرورت ہوتی ہے۔
Apple کسٹم UIView بنانے کی سفارش کرتا ہے جب معیاری اجزاء مطلوبہ فعالیت فراہم نہیں کر سکتے یا جب ایک ہی کسٹم عنصر ایپلیکیشن میں متعدد جگہوں پر استعمال ہوتا ہے۔ WWDC 2024 کے مطابق، درمیانے درجے کے پروجیکٹ میں کسٹم ویوز تمام UIView کا اوسطاً 15-20% تشکیل دیتے ہیں۔
کسٹم UIView چارٹس اور ڈایاگرام بنانے (Core Graphics کے ساتھ لکیریں اور شکلیں کھینچنا)، کسٹم پیشرفت اشارے، متحرک پس منظر، انگلی سے ڈرائنگ عناصر اور ریئل ٹائم ڈیٹا ویژولائزیشن کے لیے استعمال ہوتا ہے۔ ان میں سے ہر ایک صورت میں، ڈویلپر کو CGContext تک مکمل رسائی ملتی ہے اور وہ کوئی بھی جیومیٹری کھینچ سکتا ہے۔
اگر کسی عنصر کو معیاری UIKit اجزاء (UIButton، UIImageView، UILabel) سے Auto Layout اور خصوصیات کی ترتیب کے ساتھ جمع کیا جا سکتا ہے، تو UIView کا ذیلی طبقہ بنانا ضرورت سے زیادہ ہے۔ Apple پہلے تیار ویوز کی ترکیب آزمانے اور صرف فعالیت ناکافی ہونے پر کسٹم ڈرائنگ پر جانے کی سفارش کرتا ہے۔
کسٹم UIView بنانا UIView سے وراثت پانے والی کلاس کے اعلان اور لازمی ابتدا کاروں کو نافذ کرنے سے شروع ہوتا ہے۔ کم سے کم نفاذ میں کوڈ سے تخلیق کے لیے init(frame:) اور Storyboard یا XIB سے لوڈ کرنے کے لیے init(coder:) شامل ہے۔
import UIKit
class CircleView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
setupView()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
setupView()
}
private func setupView() {
backgroundColor = .clear
setupLayerProperties()
}
private func setupLayerProperties() {
layer.cornerRadius = bounds.width / 2
layer.masksToBounds = true
}
}
setupView() طریقہ میں ابتدائی خصوصیات مرتب کی جاتی ہیں: شفاف پس منظر، تہہ کی ترتیبات۔ اگر ویو Interface Builder میں ظاہر کیا جائے گا، تو لائیو پیش نظارہ کے لیے @IBDesignable اور @IBInspectable شامل کرنا مفید ہے۔
Custom UIView کو سسٹم کے ذریعے زندگی کے دورانیے کے طریقوں کی ایک ترتیب کے ذریعے منظم کیا جاتا ہے جو ایک مخصوص ترتیب میں کال کیے جاتے ہیں۔ اس چکر کو سمجھنا ویو کی درست ترتیب اور ڈرائنگ کے لیے انتہائی اہم ہے۔
| طریقہ | کب کال کیا جاتا ہے | مقصد |
|---|---|---|
| init(frame:) | کوڈ سے ویو بنانا | خصوصیات کی ابتدا، ذیلی ویوز شامل کرنا |
| init(coder:) | Storyboard/XIB سے لوڈ کرنا | ڈی سیریلائزیشن اور ابتدائی ترتیب |
| layoutSubviews() | فریم تبدیل ہونے پر | ذیلی عناصر کی جیومیٹری کا دوبارہ حساب |
| draw(_:) | پہلی ظاہری پر یا setNeedsDisplay() کے بعد | Core Graphics کے ذریعے مواد کھینچنا |
| didMoveToSuperview() | درجہ بندی میں شامل ہونے کے بعد | حتمی ترتیب، اینیمیشن شروع کرنا |
تمام طریقے سسٹم کے ذریعے خودکار طور پر کال کیے جاتے ہیں، اور ڈویلپر کو انہیں دستی طور پر کال کرنے کی ضرورت نہیں۔ استثنا setNeedsDisplay() ہے، جو سسٹم کو draw(_:) دوبارہ کال کرنے کا اشارہ دیتا ہے۔
draw(_:) Custom UIView میں کسٹم ڈرائنگ کے لیے کلیدی طریقہ ہے۔ اس کے اندر، ڈویلپر کو CGContext (گرافکس سیاق و سباق) تک رسائی ملتی ہے اور وہ Core Graphics کا استعمال کرتے ہوئے لکیریں، شکلیں، متن اور تصاویر کھینچ سکتا ہے۔
سسٹم خودکار طور پر draw(_:) کو کال کرتا ہے جب ویو پہلی بار اسکرین پر ظاہر ہوتا ہے۔ بعد میں کال setNeedsDisplay() کے ذریعے شروع کی جاتی ہے، جو ویو کو دوبارہ ڈرائنگ کی ضرورت کے طور پر نشان زد کرتا ہے۔ اہم: draw(_:) کو براہ راست کال نہ کریں — یہ کیشنگ میکانزم کو توڑتا ہے اور کارکردگی کو کم کرتا ہے۔
override func draw(_ rect: CGRect) {
guard let context = UIGraphicsGetCurrentContext() else { return }
// پس منظر بھرنا
context.setFillColor(UIColor.systemBlue.cgColor)
context.fill(rect)
// دائرہ کھینچنا
context.setStrokeColor(UIColor.white.cgColor)
context.setLineWidth(4.0)
let circleRect = rect.insetBy(dx: 20, dy: 20)
context.strokeEllipse(in: circleRect)
}
اس مثال میں، draw(_:) پس منظر کو نیلے رنگ سے بھرتا ہے اور کناروں سے 20 پکسلز کے فاصلے پر ایک سفید دائرہ کھینچتا ہے۔ draw(_:) کی ہر کال یکساں نتیجہ خیز ہونی چاہیے — ایک جیسے پیرامیٹرز کے ساتھ متعدد کالوں کو ایک ہی نتیجہ دینا چاہیے۔
Apple draw(_:) کے اندر کام کو کم سے کم کرنے کی سفارش کرتا ہے — UIBezierPath پہلے سے بنائیں، تصاویر کو کیش کریں اور بھاری حسابات انجام نہ دیں۔ اگر ویو جامد ہے، تو مسلسل دوبارہ ڈرائنگ کے بجائے رینڈر شدہ تصویر کے ساتھ UIImageView استعمال کرنے پر غور کریں۔
CALayer بنیادی تہہ ہے جو UIView کے بصری مواد کو منظم کرتی ہے۔ کسٹم ڈرائنگ کے بہت سے کاموں کو draw(_:) کو اووررائڈ کیے بغیر CALayer کی خصوصیات ترتیب دے کر حل کیا جا سکتا ہے، جو نمایاں طور پر زیادہ موثر ہے۔
Apple Engineering (2024) کے مطابق، CALayer سطح پر کارروائیاں GPU پر چلتی ہیں، جبکہ draw(_:) CPU پر مبنی Core Graphics رینڈرنگ کے ذریعے کام کرتا ہے۔ اینیمیشن اور ہموار منتقلی کے لیے CALayer اور CABasicAnimation استعمال کرنا ترجیح ہے۔
| منظرنامہ | تجویز کردہ طریقہ | کارکردگی |
|---|---|---|
| گول کونے | layer.cornerRadius | GPU، اعلی |
| سایے اور گریڈینٹ | CAGradientLayer، shadowPath | GPU، اعلی |
| صوابدیدی شکلیں | UIBezierPath کے ساتھ CAShapeLayer | GPU، اعلی |
| پیچیدہ گرافکس | Core Graphics کے ساتھ draw(_:) | CPU، درمیانی |
| کسٹم فارمیٹنگ والا متن | CATextLayer یا draw(_:) | حجم پر منحصر |
اینیمیشن کے ساتھ ویکٹر شکلیں کھینچنے کے لیے CAShapeLayer استعمال کریں — یہ ہارڈویئر سے تیز ہے اور draw(_:) کال کیے بغیر path، strokeStart اور strokeEnd اینیمیشن کو سپورٹ کرتا ہے۔
Custom UIView کی کارکردگی براہ راست اینیمیشن کی ہمواری اور مجموعی صارف تجربہ کو متاثر کرتی ہے۔ اہم مسائل draw(_:) کی ضرورت سے زیادہ کالز، ذیلی ویوز کی غیر موزوں ترتیب اور کیشنگ کی کمی سے پیدا ہوتے ہیں۔
setNeedsDisplay() کی ہر کال ویو کی مکمل دوبارہ ڈرائنگ کو متحرک کرتی ہے۔ اگر تبدیلیوں نے ویو کے صرف ایک حصے کو متاثر کیا ہے تو مخصوص مستطیل کے ساتھ setNeedsDisplay(_:) استعمال کریں۔ CALayer خصوصیات (backgroundColor، cornerRadius، shadow) کے لیے دوبارہ ڈرائنگ کی ضرورت نہیں — یہ GPU سطح پر اپ ڈیٹ ہوتی ہیں۔
اگر Custom UIView کا مواد شاذ و نادر ہی تبدیل ہوتا ہے، تو اسے UIGraphicsImageRenderer میں ایک بار رینڈر کریں اور UIImage کے طور پر محفوظ کریں۔ اگلی دوبارہ ڈرائنگ پر، کیش شدہ تصویر دکھانے کے لیے draw(at:) استعمال کریں — یہ Core Graphics کے ذریعے دوبارہ رینڈر کرنے سے دسیوں گنا تیز ہے۔
func renderToImage() -> UIImage {
let renderer = UIGraphicsImageRenderer(size: bounds.size)
return renderer.image { ctx in
drawHierarchy(in: bounds, afterScreenUpdates: true)
}
}
CALayer پر shouldRasterize خاصیت تہہ کے بِٹ میپ نمائندگی کی کیشنگ کو فعال کرتی ہے۔ شفافیت اور سایوں والی جامد ویوز کے لیے اسے فعال کریں — یہ کمپوزٹنگ بوجھ کو کم کرتا ہے۔ متحرک ویوز کے لیے اسے غیر فعال کریں: ہر تبدیلی پر کیش ری سیٹ ہو جاتا ہے، اور راسٹرائزیشن صرف کارکردگی کو خراب کرتی ہے۔
اکثر پوچھے گئے سوالات
نہیں، draw(_:) صرف Core Graphics کے ذریعے کسٹم ڈرائنگ کے لیے ضروری ہے۔ اگر ویو معیاری ذیلی ویوز (UILabel، UIImageView) سے بنا ہے اور CALayer استعمال کرتا ہے، تو draw(_:) کو اووررائڈ کرنا ضروری نہیں — یہ کارکردگی کو بہتر بھی کرے گا۔
کینوس پر ایک عام UIView رکھیں، Identity Inspector میں Class فیلڈ میں اپنی کلاس بتائیں۔ اگر کلاس @IBDesignable سے نشان زد ہے، تو تبدیلیاں Storyboard میں ریئل ٹائم میں ظاہر ہوں گی۔
init(frame:) پروگراماتی طور پر ویو بناتے وقت کال کیا جاتا ہے — آپ پوزیشن اور سائز کے ساتھ CGRect پاس کرتے ہیں۔ init(coder:) Storyboard یا XIB سے ڈی سیریلائز کرتے وقت کال کیا جاتا ہے۔ درست آپریشن کے لیے، دونوں کو لاگو کیا جانا چاہیے، ورنہ Interface Builder سے لوڈ کرتے وقت آپ کا ویو کریش ہو جائے گا۔
سب سے عام وجہ یہ ہے کہ ویو کا فریم صفر ہے (چوڑائی یا اونچائی صفر کے برابر)۔ سسٹم صفر جہتوں والے ویو کے لیے draw(_:) کال نہیں کرتا۔ layoutSubviews() میں فریم چیک کریں اور یقینی بنائیں کہ ویو درست رکاوٹوں کے ساتھ درجہ بندی میں شامل کیا گیا ہے۔
GPU اینیمیشن (position، opacity، transform) کو سپورٹ کرنے والی خصوصیات کے لیے CALayer استعمال کریں۔ draw(_:) کی جزوی اپ ڈیٹ کے لیے، تبدیل شدہ علاقے کے CGRect کے ساتھ setNeedsDisplay(_:) استعمال کریں — سسٹم صرف مخصوص علاقے کو دوبارہ کھینچے گا، پورے ویو کو نہیں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں