2017-04-23 2 views
-1

Ich arbeite, um den folgenden Code zu konvertieren, um das Wort in einem UIWebView überlagert zu bekommen. Es funktioniert gut in UITextView. Ich kann jedoch nichts finden, was es in UIWebView tun wird. Ich weiß, dass es existieren muss, weil ich ein Wort in einer in UIWebView geladenen Website lange drücken kann und es ausgewählt wird. Ich möchte das Wort programmatisch zurückgeben lassen. Letztendlich möchte ich die gleiche Aktion in einem ePub oder PDF machen. Jede Hilfe wird geschätzt.UIWebview word identifier

@IBOutlet weak var textView: UITextView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    let textInView = "Baa baa black sheep, have you any wool? Yes sir, yes sir, three bags full! One for the master, one for the dame, And one for the little boy who lives down the lane." 
    textView.text = textInView 
    textView.isEditable=false 
    textView.isSelectable=false 
    let panGesture = UIPanGestureRecognizer(target: self, action: #selector(self.panResponse(sender:))) 
    panGesture.minimumNumberOfTouches = 1 
    textView.addGestureRecognizer(panGesture) 
} 
    func panResponse(sender: UIPanGestureRecognizer) { 
     let location: CGPoint = sender.location(in: textView) 
     let tapPosition: UITextPosition? = textView.closestPosition(to: location) 
     if tapPosition != nil { 
      let textRange: UITextRange? = textView.tokenizer.rangeEnclosingPosition(tapPosition!, with: UITextGranularity.word, inDirection: 1) 
      if textRange != nil { 
//Do Something 
} 

Antwort

0

Hey Sie können UIMenuViewController hinzufügen und die Kopieroption überschreiben. Ich habe eine kleine Demo mit einem UIWebview hier Erweiterung meines gesamte Code

extension UIWebView { 
    override open var canBecomeFirstResponder: Bool { 
    return true 
    } 

    override open func copy(_ sender: Any?) { 
    let board = UIPasteboard.general 
    let selectedString = self.stringByEvaluatingJavaScript(from: "window.getSelection().toString()") 
    board.string = selectedString 
    let menu = UIMenuController.shared 
    menu.setMenuVisible(false, animated: true) 
    } 

    override open func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { 
    if action == #selector(UIResponderStandardEditActions.copy(_:)) { 
     return true 
    } 
    return false 
    } 
} 

ist, ich bin nur eine Web-Seite in webview geladen. Sie können einfach diese Erweiterung hinzufügen und der Rest sollte funktionieren :).

+0

Dies könnte funktionieren. Ich werde ein paar Tests versuchen. Ich bin ziemlich neu zu schnell, so kann es mich ein bisschen brauchen, um herauszufinden, wie man es implementiert. –

+0

Dies wählt Text aus. Ich muss nur das Wort zurückgeben. Wie kann ich den Auswahlteil des Codes ausschalten? –

+0

Dies beruht auch auf Javascript. Ich habe eine Javascript-Lösung, die nicht funktioniert Ich habe hier http://StackOverflow.com/Questions/43578361/swift-JScriptor-Word-Capture Die Aktion ist die Pan-Geste, die einzelne Worte zurückgeben wird übergesprungen. Während diese Erweiterung in der Nähe ist, scheint es komplizierter als ich brauche. Das Identifizieren des Wortes durch den Selektor ist ein guter Gedanke, aber ich möchte in der Lage sein, den Teil des Codes in dem Selektor zu verwenden, der das einzelne Wort auswählen kann, bevor das Wort markiert wird und das UIMenuViewControl erscheint. Ist das sinnvoll? –