iOS 将 UITextView 文本选择传播到 UITableviewCell 以显示操作菜单项
iOS Propagate UITextView text selection to the UITableviewCell to display action menu items
在尝试了很多来自 SO 的不同答案之后,我决定提出自己的问题。
我有一个包含 UITextView 的 UITableViewCell。文本视图可以包含纯文本或 links。我基本上希望 link 是可选的,但长按 link 以外的任何地方都应该显示菜单操作,例如复制和粘贴。
到目前为止我已经尝试过什么。我已将 UITextView
子类化
-(BOOL)canBecomeFirstResponder {
return NO;
}
我设置了bodyTextView.selectable = NO
。这确实提供了所需的效果,但 link 变得不可选择。
一旦我更改为 bodyTextView.selectable = YES
,link 是可选的,但长按其中只有文本的文本视图,选择没有任何操作的文本,如图所示。
理想情况下,我希望只有 link 是可选的。我也试过
- (void)textViewDidChangeSelection:(UITextView *)textView {
if(!NSEqualRanges(textView.selectedRange, NSMakeRange(0, 0))) {
textView.selectedRange = NSMakeRange(0, 0);
}
}
这肯定会删除选择,但仍然无法显示弹出操作菜单。任何帮助,将不胜感激。
请仔细阅读这个 link 以创建 hyperlink,一旦您创建了 hyperlink,默认情况下会处理可选择的基于内容的操作。
经过多次尝试,我采用了以下方法。在 UITextView 的子类中,我检查了用户是否正在触摸 link,如果没有将 textview 设置为不可选择的
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[touches allObjects] lastObject];
CGPoint tapLocation = [touch locationInView:self];
UITextPosition *textPosition = [self closestPositionToPoint:tapLocation];
NSDictionary *attributes = [self textStylingAtPosition:textPosition inDirection:UITextStorageDirectionForward];
NSURL *url = attributes[NSLinkAttributeName];
if (url) {
self.selectable = YES;
}else {
self.selectable = NO;
}
[self.superview touchesBegan:touches withEvent:event];
}
这样,如果用户触摸到 textview 的非 link 部分,它就会传递到 superview。
在尝试了很多来自 SO 的不同答案之后,我决定提出自己的问题。
我有一个包含 UITextView 的 UITableViewCell。文本视图可以包含纯文本或 links。我基本上希望 link 是可选的,但长按 link 以外的任何地方都应该显示菜单操作,例如复制和粘贴。
到目前为止我已经尝试过什么。我已将 UITextView
-(BOOL)canBecomeFirstResponder {
return NO;
}
我设置了bodyTextView.selectable = NO
。这确实提供了所需的效果,但 link 变得不可选择。
一旦我更改为 bodyTextView.selectable = YES
,link 是可选的,但长按其中只有文本的文本视图,选择没有任何操作的文本,如图所示。
理想情况下,我希望只有 link 是可选的。我也试过
- (void)textViewDidChangeSelection:(UITextView *)textView {
if(!NSEqualRanges(textView.selectedRange, NSMakeRange(0, 0))) {
textView.selectedRange = NSMakeRange(0, 0);
}
}
这肯定会删除选择,但仍然无法显示弹出操作菜单。任何帮助,将不胜感激。
请仔细阅读这个 link 以创建 hyperlink,一旦您创建了 hyperlink,默认情况下会处理可选择的基于内容的操作。
经过多次尝试,我采用了以下方法。在 UITextView 的子类中,我检查了用户是否正在触摸 link,如果没有将 textview 设置为不可选择的
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[touches allObjects] lastObject];
CGPoint tapLocation = [touch locationInView:self];
UITextPosition *textPosition = [self closestPositionToPoint:tapLocation];
NSDictionary *attributes = [self textStylingAtPosition:textPosition inDirection:UITextStorageDirectionForward];
NSURL *url = attributes[NSLinkAttributeName];
if (url) {
self.selectable = YES;
}else {
self.selectable = NO;
}
[self.superview touchesBegan:touches withEvent:event];
}
这样,如果用户触摸到 textview 的非 link 部分,它就会传递到 superview。