יום רביעי, 22 באוקטובר 2014

כפתור שאינו מלבני, בצורה גנרית ויפה

האובייקט 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


קוד הפונקציה ב Objective C



קוד הפונקציה ב Swift



ניגש לדריסה של המתודות הרלוונטיות מ UIControl

קוד הדריסה ב Objective C



קוד הדריסה ב Swift



זהו, בזו הסתיימה המלאכה, והמחלקה EllipseButton מוכנה לשימוש חוזר ככל שתצטרכו.

אתם יותר ממוזמנים להוריד את הפרוייקט המלא בשפה הרלוונטית ולנסות בעצמכם את הכפתור.

לחץ כאן להורדת הפרוייקט ב Swift

להתראות בפוסט הבא!

אין תגובות:

הוסף רשומת תגובה