2017-11-17 10 views
3

내 앱에서 드래그 앤 드롭을 구현 중입니다.UITextView에서 드래그 앤 드롭으로 텍스트 커서 표시

드래그 앤 드롭이 적용되는 (주로 드롭) 기본 화면 중 하나는 UITextView입니다.

는 다음 코드와이 UITextView에 드롭 상호 작용을 추가했습니다 :

let dropInteraction = UIDropInteraction(delegate: self)  
    inputTextView.addInteraction(dropInteraction) 

그래서 지금의 드롭을 받아들이함으로써.

하십시오 UIDropProposal를 반환 할뿐만 아니라 다음과 같은 필수 위임 방법을 내가 구현 한 필요에 따라

func dropInteraction(_ interaction: UIDropInteraction, canHandle session: UIDropSession) -> Bool { 
    return session.hasItemsConforming(toTypeIdentifiers: [kUTTypeImage as String, kUTTypeText as String]) && session.items.count == 1 
} 

: I 구현 한 방울로 다음 대리자 메서드 만 이미지와 텍스트를 수용하기 위해

performDrop의 대리자 메서드에서 다음

func dropInteraction(_ interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposal { 
    let dropProposal: UIDropProposal = UIDropProposal(operation: .copy) 
    dropProposal.isPrecise = true 
    return dropProposal 
} 

나는 떨어 내용을 처리하고 UITextView

,436,327,638에 첨부

이 모든 작업을 수행하면 이미지와 텍스트가 모두 원하는 필드에 예상대로 삭제되지만 여기에는 한 가지 문제가 있습니다.

메일 앱의 New Mail Composer에서는 항목이나 이미지를 드래그 할 때 추적 커서가 표시되어 드롭 콘텐츠가 어디로 이동하는지 알 수 있지만 예제에서는 수행 할 수 없습니다.

방울은 기존 텍스트의 끝 부분으로 이동합니다.

특정 위치로 이동하려면 원하는 위치에 커서를 놓은 다음 놓기를 수행해야합니다. 따라서 performDrop 함수에서 selectedRange으로 커서 위치를 검색합니다.

메일 응용 프로그램이나 메모 앱처럼 드롭 애니메이션이 발생하는 커서 흐름을보고 싶습니다. 드롭 응용 프로그램이있는 곳을 선택할 수 있습니다.

아무에게도이를 달성하는 방법에 대한 힌트가 있습니까?

미리 감사드립니다.

답변

0

유효한 위치와 길이가 0selectedRangeNSRange으로 설정하여 textView 또는 textField에서 커서를 이동할 수 있습니다.

나는 완성 된 코드를 망치고, 오히려 문제를 스스로 해결하는 방법에 대한 단계를 설명하여 단계를 제공하지 않습니다 : 예를 들어,

  1. 을 계산 수퍼에서 터치의 현재 위치를 touchesMoved:을 사용하여 터치 위치를 textView의 좌표계로 변환 할 수 있습니다.

  2. textView의 바운딩 rect을 계산하려면 textView의 text의 text 속성 (글꼴, 크기 등)을 적용하십시오.)과 같이 :

    [textView.text boundingRectWithSize:textView.bounds.size options:NSStringDrawingUsesLineFragmentOrigin attributes:textAttributesDict context:nil]

  3. 일치 텍스트의 경계 RECT과에 대한 터치의 위치는 텍스트에

  4. 설정 textView.selectedRange

+0

NSMakeRange(calculatedLoc, 0)에 원하는 위치를 찾을 수 ... 결코 textView 테두리 rect 사용하여 기억! 나는 당신이 말한 것을 시도해보고 나서 피드백을주기 위해 다시 컴백 할 것입니다. –

+0

@Ivan Cantarino 시도 했습니까? – Maurice

+1

몇 가지 사소한 변화와 함께 나는 그것을 작동시킬 수있었습니다. –