משתמש מבצע לחיצה ארוכה על אלמנט ומצפה לפעולות נוספות, אבל שום דבר לא קורה. או ש-UIAlertController מיושן מופיע ומכסה את כל המסך. זה פוגע בחוויית המשתמש ב-iOS ומאט את העבודה. הפתרון שלנו הוא יישום נכון של תפריט הקשר (context menu) העוקב אחרי ההנחיות של Apple ועובד על כל המכשירים: מ-iPhone SE ועד iPad Pro. יישום כזה חוסך עד 40% מזמן המשתמש ומפחית עלויות פיתוח ב-30% באמצעות תבניות מוכנות. שירות שילוב תפריט ההקשר שלנו מתחיל ב-$500 למסך ויכול לחסוך לכם עד $2,000 בעלויות פיתוח.
תפריטי הקשר מספקים למשתמשים גישה מהירה לפעולות שהם יכולים לבצע על אלמנט.
Apple Human Interface Guidelines
אילו בעיות תפריט ההקשר פותר?
תפריט ההקשר של iOS הוא אלמנט אינטראקציה סטנדרטי מאז iOS 13+. הוא מספק גישה מהירה לפעולות הקשורות לאלמנט ללא ניווט למסך חדש. יישום נכון משפר את חוויית המשתמש ומגביר את שימור המשתמשים. תפריט ההקשר מופעל פי שניים מהר יותר מ-UIAlertController ואינו חוסם את הממשק. אנו מבטיחים שהתפריט שלכם יעבוד באופן עקבי על כל המכשירים: Haptic Touch, 3D Touch, ועם משטח עקיבה (trackpad).
טעויות נפוצות: מפתחים שוכחים להפעיל userInteractionEnabled, מבלבלים בין UIMenu ל-UIAction, או לא בודקים על iPad עם משטח עקיבה. בעיות אלו גורמות לתפריט לא להופיע או להתנהג בצורה בלתי צפויה. אנו מתחשבים בכל הניואנסים: הגדרת תצוגה מקדימה נכונה, קיבוץ פעולות באמצעות displayInline, ותמיכה בבחירה מרובה ב-iOS 16+.
למה תפריט הקשר עדיף על UIAlertController?
UIAlertController חוסם את כל המסך ודורש סגירה מפורשת. תפריט ההקשר, לעומת זאת, מופיע בנקודת המגע ונסגר בצורה חלקה כאשר נבחרת פעולה. הוא תומך בתצוגה מקדימה של iOS — תצוגה מקדימה של התוכן, המאפשרת למשתמש לקבל החלטה מבלי לעזוב את המסך הנוכחי. בנוסף, ניתן להתאים אישית תפריטי הקשר עם אייקונים וכתוביות, מה שהופך אותם לאינפורמטיביים יותר ומהירים לתפיסה.
UIContextMenuInteraction עבור View שרירותי
class CardView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
let interaction = UIContextMenuInteraction(delegate: self)
addInteraction(interaction)
}
}
extension CardView: UIContextMenuInteractionDelegate {
func contextMenuInteraction(
_ interaction: UIContextMenuInteraction,
configurationForMenuAtLocation location: CGPoint
) -> UIContextMenuConfiguration? {
UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { [weak self] _ in
guard let self = self else { return nil }
let open = UIAction(title: "Открыть", image: UIImage(systemName: "arrow.up.right")) { _ in
self.handleOpen()
}
let copy = UIAction(title: "Копировать", image: UIImage(systemName: "doc.on.doc")) { _ in
self.handleCopy()
}
let delete = UIAction(
title: "Удалить",
image: UIImage(systemName: "trash"),
attributes: .destructive
) { _ in
self.handleDelete()
}
// Группировка через UIMenu
let editMenu = UIMenu(title: "", options: .displayInline, children: [copy])
return UIMenu(title: "", children: [open, editMenu, delete])
}
}
}class CardView: UIView { override init(frame: CGRect) { super.init(frame: frame) let interaction = UIContextMenuInteraction(delegate: self) addInteraction(interaction) } } extension CardView: UIContextMenuInteractionDelegate { func contextMenuInteraction( _ interaction: UIContextMenuInteraction, configurationForMenuAtLocation location: CGPoint ) -> UIContextMenuConfiguration? { UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { [weak self] _ in guard let self = self else { return nil } let open = UIAction(title: "Открыть", image: UIImage(systemName: "arrow.up.right")) { _ in self.handleOpen() } let copy = UIAction(title: "Копировать", image: UIImage(systemName: "doc.on.doc")) { _ in self.handleCopy() } let delete = UIAction( title: "Удалить", image: UIImage(systemName: "trash"), attributes: .destructive ) { _ in self.handleDelete() } // Группировка через UIMenu let editMenu = UIMenu(title: "", options: .displayInline, children: [copy]) return UIMenu(title: "", children: [open, editMenu, delete]) } } } עבור options: .displayInline מקונן מסיר את כותרת תת-הקבוצה ומפריד ויזואלית בין פריטים עם קו אופקי — תבנית סטנדרטית להפרדת פעולות הרסניות מבטוחות.
איך עובדת התצוגה המקדימה בתפריט ההקשר?
התצוגה המקדימה היא UIViewController המוצג בלחיצה ארוכה לפני הופעת התפריט. ניתן להתאים אותה כדי להציג מידע נוסף: תמונה, כרטיס מוצר, פרטי רשומה. ב-UIKit, התצוגה המקדימה מוחזרת מ-previewProvider ב-UIContextMenuConfiguration. ב-SwiftUI, פשוט ספקו closure של תצוגה מקדימה ב-modifier .contextMenu. התצוגה המקדימה משפרת את חוויית המשתמש ב-iOS בכך שהיא מאפשרת הערכה מהירה של תוכן ללא ניווט.
איך מוסיפים תפריט הקשר ב-SwiftUI?
struct ItemView: View {
var item: Item
var body: some View {
ItemCard(item: item)
.contextMenu {
Button {
openItem(item)
} label: {
Label("Открыть", systemImage: "arrow.up.right")
}
Button(role: .destructive) {
deleteItem(item)
} label: {
Label("Удалить", systemImage: "trash")
}
} preview: {
ItemPreviewView(item: item)
.frame(width: 300, height: 200)
}
}
}UIMenu ב-SwiftUI הוא התצוגה המקדימה בלחיצה ארוכה, המקבילה ל-struct ItemView: View { var item: Item var body: some View { ItemCard(item: item) .contextMenu { Button { openItem(item) } label: { Label("Открыть", systemImage: "arrow.up.right") } Button(role: .destructive) { deleteItem(item) } label: { Label("Удалить", systemImage: "trash") } } preview: { ItemPreviewView(item: item) .frame(width: 300, height: 200) } } } ב-UIKit. preview: צובע אוטומטית את הפריט באדום.
UITableView ו-UICollectionView
מתודות delegate ייעודיות ללא הוספה ידנית של previewProvider:
// UITableView
func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? {
// ...
}
// UICollectionView
func collectionView(_ collectionView: UICollectionView, contextMenuConfigurationForItemsAt indexPaths: [IndexPath], point: CGPoint) -> UIContextMenuConfiguration? {
// iOS 16+ поддерживает множественный выбор
} השוואת גישות
| גישה | מורכבות | תצוגה מקדימה | קיבוץ | בחירה מרובה |
|---|---|---|---|---|
| UIContextMenuInteraction (UIKit) | בינונית | כן | כן | לא |
| SwiftUI .contextMenu | נמוכה | כן | כן | לא |
| UICollectionView delegate | בינונית | כן | כן | iOS 16+ |
תמיכה בגרסאות iOS
| גרסת iOS | תכונות |
|---|---|
| 13.0 | תפריט הקשר בסיסי |
| 14.0 | אנימציה משופרת |
| 15.0 | תמיכה במשטח עקיבה |
| 16.0 | בחירה מרובה ב-UICollectionView |
פרטים על טעויות נפוצות
- שכחת userInteractionEnabled — ודאו שה-View מאפשר אינטראקציה.
- בלבול בין UIMenu ל-UIAction — השתמשו ב-children עבור פריטים.
- אי בדיקה על iPad עם משטח עקיבה — הדמו לחיצה ימנית.
- התעלמות מ-previewProvider — זה משפר משמעותית את חוויית המשתמש.
איך אנו מיישמים תפריטי הקשר: תהליך עבודה
- ניתוח — זיהוי נקודות אינטראקציה ופעולות נדרשות.
- עיצוב — עיצוב מבנה התפריט, קיבוץ ותצוגה מקדימה.
- יישום — כתיבת קוד באמצעות הגישה הנבחרת.
- בדיקות — בדיקה על מכשירים אמיתיים עם גרסאות iOS שונות (מעל 15 דגמים).
- פריסה — הגשה ל-App Store Connect.
מה כלול בעבודה
- קוד מקור עם הערות
- תיעוד בדיקות
- שילוב בפרויקט קיים
- תמיכה בעדכוני iOS
- הכשרת הצוות שלכם
לצוות שלנו יש ניסיון של 7+ שנים בפיתוח אפליקציות iOS וביצענו מעל 30 פרויקטים עם תפריטי הקשר (באמצעות UIContextMenuInteraction, UIMenu SwiftUI, ותפריט הקשר של UIKit). אנו מבטיחים יישום איכותי בזמן. הזמינו שילוב תפריט הקשר באפליקציה שלכם עוד היום. קבלו ייעוץ לפרויקט שלכם.
הערכות זמנים
תפריט הקשר עבור סוג אחד של View או תא — כמה שעות. יישום מלא עבור Button(role: .destructive)/UIContextMenuInteraction עם תצוגה מקדימה ופעולות מותאמות אישית — 1–2 ימי עסקים. צרו קשר להערכה של הפרויקט שלכם.
UIContextMenuInteraction — תיעוד רשמי.







