תפריטי הקשר ב-iOS: Force Touch, Haptic Touch ו-UIContextMenuInteraction
כשמפתחים אפליקציית iOS, נתקלים לא פעם במצב: המשתמש לוחץ לחיצה ארוכה על אלמנט, אבל התפריט לא מופיע. למה? כי הקוד עדיין משתמש ב-UIViewControllerPreviewing — ממשק ה-3D Touch המיושן שלא עובד במכשירים ללא Force Touch. מאז iOS 13, אפל איחדה את המנגנון: UIContextMenuInteraction אחד מחליף את שתי הגישות. אנחנו משתמשים בו בכל הפרויקטים החדשים — הוא מבטיח התנהגות עקבית ב-iPhone SE, iPad ו-iPhone 15 Pro. גישה זו מפחיתה את עלויות התחזוקה ב-30% בהשוואה לשני מימושים נפרדים.
תיעוד מפתחי Apple: UIContextMenuInteraction
למה להחליף את UIViewControllerPreviewing?
שימוש בממשק המיושן אומר שבמכשירים ללא Force Touch (iPhone XR, SE, 11 ומעלה), התפריט לא יופיע. זה מוביל לאובדן פונקציונליות ישיר עבור 80% מהמשתמשים. let interaction = UIContextMenuInteraction(delegate: self) myView.addInteraction(interaction) func contextMenuInteraction( _ interaction: UIContextMenuInteraction, configurationForMenuAtLocation location: CGPoint ) -> UIContextMenuConfiguration? { return UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { _ in let share = UIAction(title: "Поделиться", image: UIImage(systemName: "square.and.arrow.up")) { _ in self.shareItem() } let delete = UIAction(title: "Удалить", image: UIImage(systemName: "trash"), attributes: .destructive) { _ in self.deleteItem() } return UIMenu(title: "", children: [share, delete]) } } עובד באופן זהה בכל המכשירים עם iOS 13, ומפשט את הקוד בחצי.
איך UIContextMenuInteraction עובד
המחלקה הזו היא הדרך הנכונה היחידה ליצירת תפריט הקשר. היא מתאימה את עצמה אוטומטית לסוג הלחיצה: באייפונים ישנים יותר — Force Touch, בחדשים יותר — Haptic Touch. ב-iPad עם משטח עקיבה, התפריט נפתח בלחיצה ימנית. כל טיפול במחוות הוא פנימי. צריך רק להגדיר את התצורה.
מימוש בסיסי לתצוגה מותאמת אישית
let interaction = UIContextMenuInteraction(delegate: self)
myView.addInteraction(interaction)
func contextMenuInteraction(
_ interaction: UIContextMenuInteraction,
configurationForMenuAtLocation location: CGPoint
) -> UIContextMenuConfiguration? {
return UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { _ in
let share = UIAction(title: "Поделиться", image: UIImage(systemName: "square.and.arrow.up")) { _ in
self.shareItem()
}
let delete = UIAction(title: "Удалить", image: UIImage(systemName: "trash"), attributes: .destructive) { _ in
self.deleteItem()
}
return UIMenu(title: "", children: [share, delete])
}
}attributes: .destructive צובע את הפריט באדום — התנהגות iOS סטנדרטית לפעולות הרסניות. previewProvider הוא תצוגה מקדימה מותאמת אישית אופציונלית בלחיצה ארוכה; בלעדיו, iOS מציג צילום מסך אוטומטי של התצוגה.
עבור UITableView: אפילו פשוט יותר
ל-UITableView יש תמיכה מובנית דרך מתודות delegate. המימוש קצר ב-40% משימוש ישיר ב-UIContextMenuInteraction.
func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? {
let item = items[indexPath.row]
return UIContextMenuConfiguration(identifier: indexPath as NSIndexPath) { [weak self] in
ItemPreviewViewController(item: item)
} actionProvider: { _ in
UIMenu(title: "", children: [
UIAction(title: "Открыть") { _ in
self?.openItem(item)
},
UIAction(title: "Удалить", attributes: .destructive) { _ in
self?.deleteItem(item)
}
])
}
}מימוש יחיד עובד עם Force Touch, Haptic Touch ומשטח העקיבה של iPad.
השוואת גישות
| שיטה | מכשירים | מורכבות | תצוגה מקדימה מותאמת אישית | תמיכת iOS |
|---|---|---|---|---|
func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? { let item = items[indexPath.row] return UIContextMenuConfiguration(identifier: indexPath as NSIndexPath) { [weak self] in ItemPreviewViewController(item: item) } actionProvider: { _ in UIMenu(title: "", children: [ UIAction(title: "Открыть") { _ in self?.openItem(item) }, UIAction(title: "Удалить", attributes: .destructive) { _ in self?.deleteItem(item) } ]) } } |
Force Touch בלבד (6s–X) | בינונית | כן | iOS 9–13 (מיושן) |
UIViewControllerPreviewing |
כל המכשירים עם iOS 13 | נמוכה | כן (אופציונלי) | iOS 13+ |
UIContextMenuInteraction/UITableview |
כל המכשירים עם iOS 13 | נמוכה מאוד | כן (דרך delegate) | iOS 13+ |
ברור ש-UICollectionView או מתודות ה-delegate של הטבלה הן הבחירה המודרנית היחידה. אנחנו ממליצים בחום לא להשתמש בממשק הישן כדי להימנע מבעיות אישור ב-App Store — סעיף 4.2 בהנחיות הביקורת של App Store דורש פונקציונליות תקינה בכל המכשירים הנתמכים.
תהליך היישום שלנו
אנחנו נוקטים בגישה שיטתית: מנתחים היכן משתמשים עשויים להזדקק לפעולה מהירה, מעצבים את התפריט, מיישמים ובודקים בסימולטורים ובמכשירים אמיתיים.
| שלב | משך |
|---|---|
| ניתוח | 0.5 ימים |
| עיצוב | 0.5 ימים |
| יישום | יום אחד |
| בדיקות | 0.5 ימים |
| השקה | 0.5 ימים |
- ניתוח — זיהוי אלמנטים שצריכים תפריט הקשר (תאי רשימה, תמונות, קישורים).
- עיצוב — הרכבת רשימת פעולות: בשימוש תכוף בראש, הרסניות בתחתית (עם מאפיין .destructive).
-
יישום — כתיבת קוד באמצעות
UIContextMenuInteractionאו מתודות delegate. הוספת תצוגה מקדימה מותאמת אישית אם נדרש מידע מפורט. - בדיקות — בדיקה בסימולטור (לחיצה ארוכה מדמה Haptic Touch) ובמכשירים עם Haptic Touch ו-Force Touch. תשומת לב מיוחדת לתפריטי משנה ופעולות מקוננות.
- השקה — חתימה, העלאה ל-App Store Connect, שימוש ב-TestFlight לבדיקות בטא.
מה כלול בעבודה שלנו
- מימוש תפריט הקשר כולל: מאב-טיפוס ועד פרסום ב-App Store.
- אינטגרציה עם Firebase Analytics למעקב אחר פעולות שנבחרו.
- תמיכה ב-Universal Links / App Links לפתיחת התפריט מבחוץ.
- תיעוד על יישום ובדיקות.
- הכשרת הצוות שלך לעבודה עם
UIContextMenuInteraction. - אחריות לתאימות עם גרסאות iOS נוכחיות ועתידיות.
לוח זמנים משוער
יישום תפריט הקשר דרך UIContextMenuInteraction או מתודות delegate ב-UIContextMenuInteraction/UITableView — בתוך יום עבודה אחד, כולל בדיקות במכשירים עם Force Touch ו-Haptic Touch. אם נדרשת תצוגה מקדימה מותאמת אישית או אינטגרציית אנליטיקה, לוח הזמנים מתארך ליומיים.
טעויות נפוצות ואיך להימנע מהן
- שכחת הוספת
UICollectionViewלתצוגה לפני קריאה ל-UIContextMenuInteraction— התפריט לא יופיע. - שימוש ב-
addInteractionבפרויקט חדש — ב-iPhone XR ומעלה, התפריט לא יעבוד. - אי טיפול ב-
UIViewControllerPreviewing— מחיקה לא תודגש באדום. - ניסיון להתאים אישית את ה-UIMenu הסטנדרטי (שינוי צבע, גופן) — זה אסור; Apple לא מספקת יכולות כאלה.
הניסיון שלנו עוזר להימנע מהמלכודות האלה — כבר עברנו את הדרך הזו ואנחנו מכירים את כל הבורות.
צרו קשר לייעוץ. קבלו הערכה של הפרויקט שלכם והצעה מסחרית מפורטת.







