האובייקט UIButton הוא מלבני בהגדרתו.
לעיתים עולה הצורך בצורה שאינה מלבנית במיוחד כאשר משתמשים ברקע לא שקוף
ראינו בפוסט הקודם כי ניתן לייצר UILabel בעל צורה שאינה מלבנית, אך במקרה של כפתור, הפתרון לא יספיק.
מאחר והאזור במלבן בו הצורה אינה מצויירת גם לחיץ.
נפתור את העניין ב2 שלבים.
1. נצייר את הצורה הלא מלבנית, נניח לשם הפשטות אליפסה. באמצעות drawRect כמו שעשינו בדוגמא של ה EllipseLabel.
2. נגדיר פונקציה שמקבלת נקודה CGPoint והגדרות גאומטריות נדרשות של הצורה המצויירת, במקרה של אליפסה - מרכז, רדיוס רוחב ורדיוס אורך ומחזירה בוליאני האם הנקודה הינה בתוך הצורה.
ואז נדרוס את המתודות הלרוונטיות מ UIControl על מנת לא לנטר נגיעות לא רלוונטיות.
פתרון זה הוא גנרי וניתן לשימוש חוזר, ועדיף בהרבה על פתרונות קלוקלים המדברים על לקבל ב IBAction גם את ה UIEvent ושם להתחיל לנתח איפה הייתה הנגיעה.
כיוון שפתרון זה מונע בכלל את הקריאה ל IBAction, וכמובן הוא גנרי.
נצא לדרך
קוד הציור ב Objective C
קוד הציור ב Swift
ועכשיו נגדיר את הפונקציה המחשבת האם נגיעה הינה בתוך הצורה הגאומטרית
נעזר בתשובה הנמצאת בקישור הבא:
http://math.stackexchange.com/questions/76457/check-if-a-point-is-within-an-ellipse
נעזר בתשובה הנמצאת בקישור הבא:
http://math.stackexchange.com/questions/76457/check-if-a-point-is-within-an-ellipse
קוד הפונקציה ב Objective C
קוד הפונקציה ב Swift
ניגש לדריסה של המתודות הרלוונטיות מ UIControl
קוד הדריסה ב Objective C
קוד הדריסה ב Swift
זהו, בזו הסתיימה המלאכה, והמחלקה EllipseButton מוכנה לשימוש חוזר ככל שתצטרכו.
אתם יותר ממוזמנים להוריד את הפרוייקט המלא בשפה הרלוונטית ולנסות בעצמכם את הכפתור.