Подтвердить что ты не робот

Подтверждение соединения канала UITextView задерживается

В приложении iOS 7 у меня есть UITextView со ссылкой в ​​нем, но нажатие ссылки не срабатывает. Он реагирует только на неловкое "нажатие и удержание". Я хочу, чтобы он отвечал, как только пользователь нажимает на него, например, как работает тег ссылки UIWebView. Вот моя настройка:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:@"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."];
    [text addAttribute:NSLinkAttributeName value:@"myurl://tapped" range:NSMakeRange(6, 16)];

    self.textView.attributedText = text;
    self.textView.editable = NO;
    self.textView.delaysContentTouches = NO;
}

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange
{
    if ([[URL scheme] isEqualToString:@"myurl"])
    {
        // Handle tap

        return NO;
    }

    return YES;
}

Документация Apple для метода shouldInteractWithURL гласит: "Текстовое представление вызывает этот метод, если пользователь нажимает или долго нажимает ссылку URL". Длительное нажатие работает, но кран не работает.

Кто-нибудь знает, как заставить это ответить немедленно?

4b9b3361

Ответ 1

Можно выбрать UITextView?. Попробуйте:

self.textView.selectable = YES;

Изменить:

Я начинаю думать, что, возможно, длинный пресс - единственный способ уволить его вопреки тому, что говорит яблоко. Проверьте link, возможно, это поможет.

Ответ 2

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

Я написал Gist, который решает это для iOS 7/8. Это легкое расширение UITextView, которое также пересылает -[UITextViewDelegate textView:shouldInteractWithURL:inRange:] и предоставляет внутренний распознаватель жестов.

https://gist.github.com/benjaminbojko/c92ac19fe4db3302bd28

Вот пример: Пример ниже работает только на iOS 8. См. раздел выше для поддержки iOS 7 + 8.

Добавьте свой распознаватель кран:

// ...

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedTextView:)];
[myTextView addGestureRecognizer:tapRecognizer];
myTextView.selectable = YES; // otherwise the gesture won't recognize

// ...

И добавьте обратный вызов:

- (void)tappedTextView:(UITapGestureRecognizer *)tapGesture {
    if (tapGesture.state != UIGestureRecognizerStateEnded) {
        return;
    }

    UITextView *textView = (UITextView *)tapGesture.view;
    CGPoint tapLocation = [tapGesture locationInView:textView];
    UITextPosition *textPosition = [textView closestPositionToPoint:tapLocation];
    NSDictionary *attributes = [textView textStylingAtPosition:textPosition inDirection:UITextStorageDirectionForward];

    NSURL *url = attributes[NSLinkAttributeName];

    if (url) {
        [[UIApplication sharedApplication] openURL:url];
    }
}

И быстрая версия:

Нажмите распознаватель:

let tapRecognizer = UITapGestureRecognizer(target: self, action: Selector("tappedTextView:"))
myTextView.addGestureRecognizer(tapRecognizer)
myTextView.selectable = true

Callback:

func tappedTextView(tapGesture: UIGestureRecognizer) {

        let textView = tapGesture.view as! UITextView
        let tapLocation = tapGesture.locationInView(textView)
        let textPosition = textView.closestPositionToPoint(tapLocation)
        let attr: NSDictionary = textView.textStylingAtPosition(textPosition, inDirection: UITextStorageDirection.Forward)

        if let url: NSURL = attr[NSLinkAttributeName] as? NSURL {
            UIApplication.sharedApplication().openURL(url)
        }

        }

Ответ 3

Как упоминалось в nnarayann, CCHLinkTextView избегает проблемы распознавания отложенных кранов. Эта библиотека реализует свой собственный распознаватель жестов и теперь доступна в версии 1.0.

Ответ 4

Иногда он не работает на iOS Simulator или работает только при нажатии и удержании.

Вы должны протестировать его на реальном устройстве.

И не забудьте установить его selectable.

Ответ 5

Если нет какой-либо насущной причины использовать UITextView, например, если отображается другой текст, вы можете использовать UILabel в сочетании с UITapGestureRecognizer, чтобы получить эффект, который вы ищете.

В противном случае вы можете перейти с фактическим UIWebView.

Ответ 6

Вы пытались установить textview.delaysContentTouches = NO;? Может быть, это может помочь.

Ответ 7

Решение Swift 4


  • Обрабатывает ссылки с помощью распознавателя жестов нажатия.
  • isSelectable true или false работает

let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleLinkTap(_:)))
textView.addGestureRecognizer(tapRecognizer)

@objc func handleLinkTap(_ recognizer: UITapGestureRecognizer) {
    let tapLocation = recognizer.location(in: textView)
    guard
        let textPosition = textView.closestPosition(to: tapLocation),
        let urlString = textView.textStyling(at: textPosition, in: .forward)?[NSAttributedStringKey.link.rawValue] as? String, urlString == "myurl"
    else { return }

    let url = URL(string: urlString)!
    // Do whatever you want with this URL, such as
    UIApplication.shared.openURL(url)
}