PracticU

אנימציה ב-Xcode-Swift - חלק 3

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאייפון iPhone iOS - ב-Swift-Xcode › אנימציה ב-Xcode-Swift - חלק 3
מילון מושגים:
Xcode - סביבת הפיתוח של אפל לכתיבת אפליקציות ל-iOS ול-macOS.
תמונה - קובץ גרפי המוצג על המסך. בהקשר של וירטואליזציה או Docker, תבנית מוכנה שממנה יוצרים מכונה או קונטיינר.
מתודה - פונקציה המוגדרת בתוך מחלקה ומתארת פעולה שאובייקטים מאותה מחלקה יכולים לבצע.
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
משתנה - שם שמפנה למקום בזיכרון שבו נשמר ערך שיכול להשתנות במהלך ריצת התוכנית, כמו מספר, טקסט או אובייקט.
View - רכיב שאחראי על הצגת המידע למשתמש (התצוגה) בדפוס MVC. גם טבלה וירטואלית מבוססת שאילתה במסד נתונים.
אובייקט - יחידה בתכנות מונחה עצמים שמאגדת נתונים (תכונות) ופעולות (מתודות). נוצר בדרך כלל ממחלקה המשמשת כתבנית.
iOS - מערכת ההפעלה של אפל למכשירי iPhone ו-iPad.

אנימציה ב-Xcode-Swift - חלק 3
בשיעור שני ViewControllers מתקשרים זה עם זה. ה-ViewController של הקולקשן מודיע ל-ViewController הראשי על לחיצה, בעזרת דלגייט (Delegate), והראשי מציג אנימציה של התמונה שנלחצה.
השלבים העיקריים
1. פרוטוקול: מגדירים פרוטוקול עם המתודה didSelectIcon, שמקבלת תמונה ומיקום (CGPoint). הפרוטוקול הוא רשימה של פעולות שאפשר להודיע עליהן.
2. Class-bound: הפרוטוקול מוגדר כ-AnyObject, כלומר רק מחלקות יכולות לממש אותו. כך אפשר להחזיק את הדלגייט כ-weak reference ולמנוע ריטיין סייקל.
3. משתנה הדלגייט: weak var delegate מסוג הפרוטוקול, והוא אופציונלי. כשמישהו לוחץ על תא, קוראים לפעולה של הדלגייט אם הוא קיים.
4. מיקום התמונה: באמצעות layoutAttributesForItem מקבלים את המרכז של התא. הפתרון הזה פשוט, ולכן נדרש צעד נוסף: המרת הנקודה לקואורדינטות של ה-superview בעזרת convert.
5. התקשורת: ה-ViewController הראשי מממש את הפרוטוקול בתוך extension, ומגדיר את עצמו כדלגייט של ה-ViewController שבתוך הקונטיינר.
6. אנימציה: יוצרים Image View חדש במיקום ההתחלתי, מוסיפים אותו לתצוגה, ומזיזים את המרכז בעזרת UIView.animate עם קפיץ (usingSpringWithDamping 0.5). בסיום, אחרי כ-0.2 שניות, מסירים את ה-view מה-superview.
שימו לב
דלגייט הוא דרך לתקשורת בין שני אובייקטים בלי שאחד יכיר את המימוש של השני, ובעבודה עם פלאטפורמה כמו iOS זה דפוס חשוב מאוד שכדאי לתרגל.
כך שני ViewControllers מתקשרים דרך דלגייט, והתוצאה מוצגת באנימציה.
השיעור הבא בקורס: אנימציה ב-Xcode-Swift - חלק 4

פרקי ההרצאה: אנימציה ב-Xcode-Swift - חלק 3

  1. 00:00

    מבוא לתקשורת בין ViewControllers

  2. 00:40

    הגדרת פרוטוקול Delegate לאייקונים

  3. 03:40

    דריסת didSelectItemAt ומיקום הלחיצה

  4. 05:47

    פרוטוקול למחלקות בלבד וכ-weak

  5. 07:46

    שליחת ההודעה לדלגייט

  6. 09:16

    הרשמה כ-delegate של ה-ViewController הילד

  7. 11:07

    מימוש הפרוטוקול ב-extension

  8. 13:48

    אנימציה עם בלוק completion

תמלול ההרצאה: אנימציה ב-Xcode-Swift - חלק 3

הטקסט המלא של הדקות הראשונות בהרצאה «אנימציה ב-Xcode-Swift - חלק 3» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    שלום וברוכים הבאים בשיעור הקודם ראינו איך אנחנו יכולים להציג קולקשן ויו כאמבדד ויו קונטרולר, כלומר להציג ויו קונטרולר אחד בתוך ויו קונטרולר שני.

  2. 00:13

    היום אנחנו נרצה קודם כל ללמוד איך לבצע את התקשורת הזאת בצורה מסודרת שהיא מקובלת גם בעולם, ודבר שני, מעבר לביצוע של התקשורת בין שתי ויו קונטרולרים, בין השיחה הזאת בין שני הויו קונטרולרים, הדבר השני שאני רוצה לעשות זה קצת אנימציות ולשדרג את הידע שלנו באנימציות אז מה שאנחנו נעשה, אנחנו קודם כל נתחיל ב-Collection

  3. 00:35

    View Controller ב-Collection View Controller אנחנו בעצם רוצים לקיים איזשהו דיאלוג כדי לקיים דיאלוג בתכנות מונחת סמים, הרבה פעמים אנחנו הולכים לפתרון של callback באיזושהי צורה. עכשיו, מה שאנחנו יכולים לעשות זה להגדיר בקובץ שלנו מה שנקרא delegate.

  4. 00:55

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

  5. 01:17

    קונטרולר דלגייט עכשיו הדלגייט בעצם זו דרך להודיע הודעות כן להפעיל פעולות ואת הפעולות רושמים כאן בסדר נגיד יש לי פרוטוקול פרוטוקול זה רשימה של פעולות באיזושהי צורה. אז בואו נגדיר לעצמנו פעולה, נניח נקרא לה did select, נגיד אייקון, עכשיו האייקון יהיה טייפ של UI image, אנחנו רוצים שהדבר הזה יהיה פונקציה, סליחה.

  6. 01:49

    יפה, אז did select icon למשל. פרמטר נוסף שאנחנו נרצה יהיה ה-position, אז אני אקרא לפרמטר הזה add שם חיצוני, position שם פנימי, והטייפ של זה יהיה city point.

  7. 02:03

    עצרו רגע, בואו נראה מה כתבנו. אז בעצם יש לי פרוטוקול שאמור להודיע למי שמעוניין שלחצו על אייקון בפוזיצ'ן מסוים, ב-XY מסוים.

  8. 02:13

    עד כאן זה פשוט ליסט של definitions, בסדר? ליסט של behaviors. ויש לי כאן רק one behavior, one method did select.

  9. 02:24

    איך אנחנו משתמשים בדבר הזה בכלל? אנחנו נראה, לאט לאט. הדבר הזה בעצם נקרא delegation, אוקיי? delegate, delegation זה design pattern שקצת קשה לעכל אותו, קצת קשה ככה לתפוס אותו בהתחלה כי הוא בנוי על אוסף של סדרה של פעולות אבל הצעד הראשון הוא להגדיר את הפרוטוקול.

  10. 02:45

    אז הנה, עשינו את הצעד הראשון. עכשיו, הצעד השני זה לקרוא לפעולה הזאת של דלגייט ולשמור משתנה מסוג הדלגייט. מה הכוונה? יהיה לנו פה אופצ'יונל var תרשמו לעצמכם צעד שני במתכון מטבח, נקרא לו דלגייט והטייפ שלו יהיה הטיפוס שהגדרנו למטה.

  11. 03:06

    אז Icons Collection View Delגate. אוקיי אופציונל למה אופציונל כי אם יהיה לנו מאזין אז מצוין אם לא יהיה לנו מאזין אז אנחנו גם נעבוד אוקיי כלומר הדבר הזה הוא סטנדלון קולקשן ויו הוא קונטרולר שלי הוא סטנדלון הוא יכול לעבוד יכול לא לעבוד

  12. 03:26

    עכשיו אם מישהו רוצה להירשם לאיבנט הזה שנקרא did select icon מי שרוצה לדעת שלחצו על אייקון אז הוא יכול להירשם אבל זה לא הכרחי זה לא חובה עכשיו מה שאנחנו נעשה יש לנו פה פעולה בקולקשן ויו שנקראת did select item at אוקיי היא לא כתובה פה באוסף המרשים של העיירות מלמטה אני אוריד

  13. 03:50

    דרך אגב את כל העיירות אני לא צריך אותן למרות שזה נחמד כמובן לקרוא אותן אני רוצה לדרוס פה פעולה שנקראת did select item at זאת פעולה שממילא הייתה כאן אוקיי כלומר תמיד יכולתי לקבל מידע על לחיצות ב-collection view עכשיו מה אני רוצה לעשות ב-did select item at קודם כל אנחנו רוצים לדעת על איזה

  14. 04:12

    תמונה לחצו אז let שווה לאיקונס במקום האינדקס פאף ואנחנו יודעים את הסיפור הזה עם המודול הוא נכון אז יש לי תמונה ביד אוקיי אינדקס פאף נקודה אייטם מוד 6 אז הנה מצאתי את האימג' האימג' זה אחת התמונות שאנחנו מציגים עליה לחצו יפה מאוד

  15. 04:41

    מכאן אני בעצם יכול להגיד הנה did select image אבל מה ה-position של הדבר הזה מה ה-XY של הדבר הזה באופן נאיבי יש לנו פעולה שנקראת layout attributes אני אראה לכם אותה. אז הייתי יכול לומר let point שווה ל-collection view נקודה layout attributes for item את אינדקס פאף.

  16. 05:02

    האינדקס פאף זה נתון לי כבר, אז הנה יש לי את ה-layout attributes. מתוך ה-layout attributes יש לנו את ה-center למשל.

  17. 05:10

    אוקיי? עכשיו זה cg-point. זה אופציונל בגלל שלא בהכרח שיהיה להם layout attributes עבור, אז בואו נעשה נניח guard let, אחרת יצא החוצה.

  18. 05:27

    והנה יש לי גם image וגם point. אני שוב פעם טוען שזה פתרון נאיבי, אני אראה לכם פתרון יותר מושלם אחר כך אבל בינתיים אנחנו נתחיל, זו התחלה טובה דרך אגב וזה הכיוון אבל הוא לא מושלם אני אראה לכם אחר כך למה ואיך לתקן.

  19. 05:42

    עכשיו הדלגייל דיזיין פאטרן זה הדבר הכי חשוב שאני יכול ללמד אתכם וזו שאלה ששואלים ברעיונות עבודה לפעמים וגם אם לא שואלים אז אתם חייבים לדעת את זה בשביל לעשות איזושהי עבודה בתכנון.

  20. 05:56

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

  21. 06:30

    כלומר פרוטוקול שמיועד לקלאסים עכשיו למה זה טוב בגלל שעכשיו אני יכול להחזיק משתנה מסוג ה-Delegate ולהפוך אותו להיות Weak Variable. Weak מתייחס בעצם ל-Reference Counting נכון לספירה של מצביעים ומה שאני רוצה להגיד פה בעצם זה שתחשבו שיש לכם שתי קלאסים שמדברים אחד עם השני אם קלאס A מצביע על קלאס B

  22. 06:54

    וקלאס B מצביע על קלאס A עלול להיווצר לנו מצב של Retained Cycle מצב שבו אובייקט אחד מצביע על השני והשני מצביע עליו ואז שניהם ביחד יש להם רפרנס קאונט של יותר מאחד והם לא יכולים להיאסף הזיכרון שלהם לא יכול להיאסף אפילו אם בעצם משתמש לנו בכלל עבר מסך יש לנו נוצר לנו ממורי ליק בגלל שהם מצביעים אחד על השני

  23. 07:18

    כדי למנוע ריטיין סייקל אנחנו נחזיק וויק רפרנס באחד הצדדים אוקיי נגיד כאן אנחנו נחזיק וויק רפרנס ואז אנחנו לא מחזיקים רפרנס חזק אחד הצדדים מצביע בצורה חזקה והצד השני מצביע בצורה חלשה, בצורה שיוויק, אוקיי?

  24. 07:39

    אז זהו, אז שלב מספר 2, הגדרנו רפרנס או וויק רפרנס מהטייפ של הדלגייט, ושלב מספר 3, אנחנו רוצים להודיע לדלגייט ברגע שקרה איזשהו איבנט מעניין.

  25. 07:52

    האיבנט המעניין did select item פה, אז אנחנו פשוט רוצים להודיע לדלגייט, אנחנו יכולים להגיד the delegate, עכשיו אתם יודעים שהוא אופציונל אז אם אתה קיים, בחרו באייקון, אני רציתי להודיע לך על זה, יקירי.

  26. 08:07

    אז הנה, קח לך את האימג', והפוינט, אני אתן לך את הפוינט הנוכחי שאני חושב שהוא נאיבי כמו שאמרנו, אבל מצוין. שימו לב לכל השלבים כמעט יחד.

  27. 08:20

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

  28. 08:31

    call the delegate זה כמו callback, אז כתבתי call, אתם יודעים, tell the delegate, talk to the delegate, בסדר? להודיע, inform.

  29. 08:42

    עכשיו, זה צד אחד. צד שני זה ה-view controller. עכשיו, הוא רוצה לדעת בעצם, אוקיי? אני אמזער פה קצת את הדברים האלה, אני אוריד מפה קצת הערות ואני אסדר קצת את הקוד כדי לפנות לנו מקום.

  30. 08:59

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

  31. 09:08

    עכשיו, מה שאנחנו רוצים עכשיו להוסיף, זה בעצם להירשם כמאזין. אני רוצה להגיד ל-ViewController הזה שאני מציג, לאייקונים, שאם בחצו על אלמנט, תודיע לי.

  32. 09:20

    כדי לעשות את זה, אנחנו קודם כל נצטרך להשיג רפרנס לאלמנט. למזלנו, יש לנו את ה-Child View Controlers. הוא בעצם נחשב כ-Child שלי, הוא Children, הוא נמצא ב-Children.

  33. 09:34

    אנחנו יכולים ממש ככה לבדוק כמו קודם. ניקח את ה-Children הראשון, נקרא לזה דולר אפס כמו שעשינו קודם רגע אני אצמצם פה קצת דולר אפס is הטייפ ששם נכון?

  34. 09:58

    אייקונס קולקשן ויו קונטרולר אוקיי וזה בעצם בוא נעשה let icons vc שווה עכשיו אנחנו יודעים שזה יהיה האייקונס ויו קונטרולר אז אני אעשה קאסטינג ואם יש לי אותו if let אייקונס vc שווה לאייקונס vc אם הוא לא נעיל אזי דרך אגב לא בכוונה האותיות שונות אני יכול לבחור באותן אותיות הכל טוב אין שום בעיה מצוין אזי אנחנו רוצים להגיד

  35. 10:38

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

  36. 10:59

    יש פה קצת בעיה כי אתה רוצה להיות הדלגייט? אין שום בעיה, רק תוסיף אותה מתודה שכתובה בפרוטוקול. אנחנו לא רוצים לעשות קאסטינג בפורס, אנחנו רוצים פשוט באמת לממש את הפרוטוקול וזה הצעד הבא.

  37. 11:14

    הצעד הבא יהיה באמת לממש את הפרוטוקול extension ל-view controller שאני נמצא בו כדי לממש את הדלגייט ואם מימשנו את הדלגייט אז חייב שתהיה לנו את הפעולה של did select item add נכון did select icon add מצוין מה אני אעשה פה זה כבר עניין שלי אולי אני אדפיס את האייקון אולי אני אדפיס את הפוזישן לרגע לעת עתה אבל בואו נצליח בואו נבדוק אם הצלחנו במשימה

  38. 11:50

    שלנו עד הלום בוא נראה מה קורה פה בעצם אז אנחנו מריצים אני לוחץ על האייקון של הליצן רואה שזו איזושהי תמונה ויש פה איזשהו פוזישן אני לוחץ על הצען השני תמונה אחרת עם פוזישן אחרת, אתם רואים פה כתובת קצת שונה בזיכרון, לא בהרבה, אבל כן קצת שונה.

  39. 12:17

    מצוין, ואנחנו רואים גם שהפוזישן התקדם בציר X, ציר Y באותו גובה, אז 75, אבל ציר X מתקדם יפה, רואים? נגיד השמש, 300. הדבר הזה, 422. מעניין.

  40. 12:31

    עכשיו, מה שפחות מוצלח מבחינתנו זה שהבטיח הוא ב-500 כביכול, וזה איקס הולך ועולה ולכן אמרתי קודם שהפוזישן הוא קצת נאיבי אבל היי לאט לאט צעד צעד שימו לב שהצלחנו לקבל פה לויו קונטרולר המארח אינפורמציה

  41. 12:49

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

  42. 13:09

    בסדר? זאת אומרת לשבת פה, לעבוד, לעשות את אותה דוגמא מצידי כמו תוכי אלף פעמים עם עוד פרויקט ועוד פרויקט עד שאתם יוצאים ומבינים את זה. לקרוא באינטרנט מה שאתם צריכים, לחזור על הסרטון, להכיר היטב את הדלגייט פאטר ולכתוב אותו בעצמנו, לא רק לצרוך אותו כמו שאנחנו עושים הרבה פעמים

  43. 13:30

    ב-Table View Controller או ב-Collection View Controller. טוב, בסדר, אז אמרתי לכם מספיק מה אני חושב. מה שאנחנו רוצים עכשיו לעשות זה קצת אנימציות, אז בואו נעשה אנימציה.

  44. 13:43

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

  45. 13:58

    קומפלישן זה איזשהו קטע קוד שאני רוצה לעשות ברגע שסיימתי את האנימציה. בואו נראה לכם מה הכוונה. אז אנחנו רוצים לעשות uofu animate with duration בוא נגיד duration יהיה 0.4 אנימציות זה בלוק אז עושים פה enter בסדר ואני אעשה פה רגע הערה לגבי הקוד עכשיו completion זה גם כן בלוק אז שוב פעם אנחנו

לקורס המלא: קורס פיתוח אפליקציות לאייפון

ההרצאה הקודמת: אנימציה ב-Xcode-Swift - חלק 2

ההרצאה הבאה: אנימציה ב-Xcode-Swift - חלק 4

הרצאות קשורות מקורסים אחרים

  • אנימציה ראשונה שלי באנדרואיד

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים
  • קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA
  • קורס פלאטר - Flutter - שפת DART של גוגל למובייל - פיתוח אפליקציות לאנדרואיד ואייפון
  • קורס PhoneGap - פיתוח אפליקציות לאנדרואיד ואייפון