2

Кто-нибудь знает, какие методы вызывают, когда пользователь меткает двумя пальцами в UITextView?Mimic UITextView по умолчанию по двойному касанию

Когда пользователь щелкает двумя пальцами, выбирается весь текст в абзаце. Я хотел бы реализовать тот же выбор программным образом, чтобы сделать этот выбор абзаца доступным в моем индивидуальном методе жестового обращения.

+0

Вы уже настроили индивидуальный жест выделения и связанный с ним метод? –

+0

Да, '- (IBAction) tapTextViewGesture: (id) отправитель { NSLog (@" TAP "); } ' – Adelmaer

ответ

2

Судя по указанию по умолчанию для распознавателя жестов двойного касания selectAll:, вызывается для обработки текста. Аналогичным образом вы можете заставить свое текстовое представление выбрать текст при распознавании вашего единственного распознавателя жестов, используя selectAll: в существующем методе tapTextViewGesture: (как описано в вашем комментарии).

Если вы хотите, чтобы текст опции, чтобы показать автоматически, как они делают в ответ по умолчанию двойное нажатие жест распознаватель на (т.е. вырезание, копирование, вставка и т.д.), установите selectAll: в self:

- (IBAction)tapTextViewGesture:(id)sender { 
    [self.textView selectAll:self]; 
} 

В противном случае , просто выделите текст без отображения меню, установите его в nil:

- (IBAction)tapTextViewGesture:(id)sender { 
    [self.textView selectAll:nil]; 
} 

Обновлено

Как указано OP в комментариях, распознаватель двойного касания UITextView изначально только приводит к выбору одного абзаца.

Во-первых, откройте меню редактирования из текущей позиции курсора:

// Access the application's shared menu 
UIMenuController *menu = [UIMenuController sharedMenuController]; 

// Calculate the cursor's position within the superview 
// and convert it to a CGRect 
CGPoint cursorPosition = [self.textView caretRectForPosition:self.textView.selectedTextRange.start].origin; 
CGPoint cursorPositionInView = [self.textView convertPoint:cursorPosition toView:self.view]; 
CGRect menuRect = CGRectMake(cursorPositionInView.x, cursorPositionInView.y, 0, 0); 

// Show the menu from the cursor's position 
[menu setTargetRect:menuRect inView:self.view]; 
[menu setMenuVisible:YES animated:YES]; 

Затем выберите текущий абзац, вот что я рекомендую:

// Break the text into components separated by the newline character 
NSArray *paragraphs = [self.textView.text componentsSeparatedByString:@"\n"]; 

// Keep a tally of the paragraph character count 
int characterCount = 0; 

// Go through each paragraph 
for (NSString *paragraph in paragraphs) { 

    // If the total number of characters up to the end 
    // of the current paragraph is greater than or 
    // equal to the start of the textView's selected 
    // range, select the most recent paragraph and break 
    // from the loop 
    if (characterCount + paragraph.length >= self.textView.selectedRange.location) { 
     [self.textView setSelectedRange:NSMakeRange(characterCount, paragraph.length)]; 
     break; 
    } 

    // Increment the character count by adding the current 
    // paragraph length + 1 to account for the newline character 
    characterCount += paragraph.length + 1; 
} 
+0

Большое спасибо, эти методы работают, но не для выбора отдельных абзацев, он выбирает весь текст в UITextView. Текст в моем textView состоит из нескольких абзацев. Эти параграфы делятся на \ n \ n пространство.В моем приложении мне нужно выбрать только абзац, на который пользователь набирает, а не весь текст в TextView. Разве вы не знаете, как реализовать выбор абзаца? – Adelmaer

+0

Нужна такая же функциональность, как в приложении «Заметки», но с одним нажатием, вот скриншот [link] (https://www.dropbox.com/s/xch41jowszsnea1/Screen%20Shot%202014-12-28%20at%2015.16. 24.png? Dl = 0). Вы можете видеть на этом снимке экрана, что он выбирает только абзац, а не весь текст, когда пользователь удаляет этот абзац. – Adelmaer

+0

Спасибо, Линдси. Ваш код работает, но в моем случае (общее меню) не всегда появляется в верхней части абзаца. Таким образом, я вышел с сочетанием вашего кода [link] (http://stackoverflow.com/a/27673217/3287785) и кода [link] (http://stackoverflow.com/a/27673272/3287785) от @Мир Warcraft . – Adelmaer

1

См ссылку на UITextInputTokenizer протокола:

Экземпляр класса, который принимает протокол UITextInputTokenizer - это токенизатор; токенизатор позволяет системе ввода текста оценивать текстовые единицы разной степени детализации. Гранулярность текстовых блоков всегда оценивается со ссылкой на хранилище или справочное направление.

По протоколу, используйте - (UITextRange *)rangeEnclosingPosition:(UITextPosition *)position withGranularity:(UITextGranularity)granularity inDirection:(UITextDirection)direction и установите UITextGranularity в UITextGranularityParagraph обнаружить TextRange с зернистостью вы создали.

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 

    if (touches.count == 2) { 
    UITouch *touch = [[event allTouches] anyObject]; 
    CGPoint touchLocation = [touch locationInView:self.textView]; 

    //calculate the distance from touch 
    UITextPosition *position = [self.textView closestPositionToPoint:touchLocation]; 
    NSUInteger distanceFromTouch = [self.textView offsetFromPosition:self.textView.beginningOfDocument 
                  toPosition:position]; 
    //calculate the position by offset 
    UITextPosition *positionOffset = [self.textView positionFromPosition:self.textView.beginningOfDocument 
                offset:distanceFromTouch]; 

    //set up the granularity 
    UITextGranularity granularity = UITextGranularityParagraph; 

    //implement the protocol 
    id<UITextInputTokenizer> tokenizer = self.textView.tokenizer; 
    UITextRange *textRange = [tokenizer rangeEnclosingPosition:positionOffset 
               withGranularity:granularity 
                inDirection:UITextWritingDirectionLeftToRight]; 

    //select the textRange 
    [self.textView setSelectedTextRange:textRange]; 

    self.textView.keyboardType = UIKeyboardTypeNamePhonePad; 

    } 
} 

Не забывайте назначать протокол. @interface ViewController()<UITextInputTokenizer>

+0

Спасибо, это также отлично работает для всего текста в UITextView, но не для абзацев, я также добавил [self.textView getFirstResponder]; чтобы он работал в моем - (IBAction) методе tapTextViewGesture: (id). Но в моем случае мне нужно выбрать только абзац, который коснулся (постучал) пользователем, а не весь текст в моем текстовом элементе. Если вы дважды используете приложение примечаний в абзаце, выбирается только абзац, а не весь текст. Мне нужна такая же функциональность. Вот пример: [link] (https://www.dropbox.com/s/xch41jowszsnea1/Screen%20Shot%202014-12-28%20at%2015.16.24.png?dl=0) – Adelmaer

+0

@Adelmaer Я обновляю мой ответ. –

+0

Спасибо, этот UITextInputTokenizer действительно замечательный. Но не показывать копию в приложении в моем приложении. Вот почему я, наконец, вышел с сочетанием вашего кода с и детализацией, а также код из ответа Lyndsey для отображения меню копирования. – Adelmaer

Смежные вопросы