2014-10-09 2 views
3

Я пытаюсь отобразить UimenuController, но я не могу его просмотреть. Как я могу сделать?Swift- Set Visible menucontroller

let MenuController: UIMenuController = UIMenuController.sharedMenuController() 
MenuController.menuVisible = true 
MenuController.arrowDirection = UIMenuControllerArrowDirection.Down 
MenuController.setTargetRect(CGRectMake(100, 80, 50, 50), inView: self.view) 
let MenuItem_1: UIMenuItem = UIMenuItem(title: "Menu", action: "delete:") 
let MenuItems: NSArray = [delete] 
MenuController.menuItems = MenuItems 
+1

Вам нужно вызвать метод setMenuVisible: (BOOL) menuVisible анимированный: (BOOL), анимированный на UIMenuController – Sandeep

+0

Я не знаю, пожалуйста, один пример –

ответ

14

Для того, чтобы на самом деле имеют меню для отображения вам необходимо сделать следующее:

  1. вызовов becomeFirstResponder(), прежде чем вы получите ваш sharedMenuController
  2. Вызов menu.setMenuVisible (правда, анимированные: истинно) в конце
  3. Переопределение функции canBecomeFirstResponder
  4. Override функция canPerformAction
  5. Написать функцию для селектора

Ниже приведен пример

func someFunc() { 
    becomeFirstResponder() 
    var menu = UIMenuController.sharedMenuController() 
    var deleteItem = UIMenuItem(title: "Delete me", action: Selector("deleteLine")) 
    menu.menuItems = [deleteItem] 
    menu.setTargetRect(CGRectMake(100, 80, 50, 50), inView: self) 
    menu.setMenuVisible(true, animated: true) 
} 

func deleteLine() { 
    //Do something here 
} 

override func canBecomeFirstResponder() -> Bool { 
    return true 
} 

override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool { 
    // You need to only return true for the actions you want, otherwise you get the whole range of 
    // iOS actions. You can see this by just removing the if statement here. 
    if action == Selector("deleteLine") { 
     return true 
    } 
    return false 
} 
+0

Большое спасибо, и если бы я хотел отобразить меню выше точки длинного нажатия? –

+0

Сначала настройте длинный обработчик, а затем вы можете вызвать someFunc из функции longPress. Функция длительной печати имеет два состояния, которые вам позаботятся о UIGestureRecognizerState.Began и UIGestureRecognizerState.End –

+0

Спасибо [закрыто] –

3

Swift 3 версия Код:

func someFunc() { 
    becomeFirstResponder() 
    var menu = UIMenuController.shared 
    var deleteItem = UIMenuItem(title: "Delete me", action: #selector(ViewController.deleteLine)) 
    menu.menuItems = [deleteItem] 
    menu.setTargetRect(CGRect(x: 0.0, y: 0.0, width: 20, height: 20), in: self) 
    menu.setMenuVisible(true, animated: true) 
} 

func deleteLine() { 
    //Do something here 
} 

override var canBecomeFirstResponder: Bool { 

     return true 
    } 

override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { 
     // You need to only return true for the actions you want, otherwise you get the whole range of 
     // iOS actions. You can see this by just removing the if statement here. 
     if action == #selector(ViewController.deleteLine) { 
      return true 
     } 

     return false 
    } 
+0

@BhadreshKathiriya Попробуйте заменить «in: self» на объект, который вы хотите отобразить в меню, например «in: UIView», – mriaz0011