我需要实现这样的事情:
hashtag条目区域需要像这样工作: 你开始链接#已经存在。你不能删除这个#。您键入您的主题标签,该主题标签不得包含任何空格。当您键入空格时,它会“输入”主题标签。这会在它周围放一个带有X按钮图标的灰色框。这显示了输入的主题标签。如果点击X,它将删除标签,所有类型将向左移动。 键入空格后,它会在框内标签的右侧移动一个空格,然后再以#开头,这样您就不必在创建标记时键入#。
我知道如何使用UITextView, - (void)textViewDidChange:(UITextView *)textView,TTTAttributedLabel,但这是相当多的工作。我想看看其他人是否已经以更简单和优雅的方式解决了这个问题。
是否有现成的库来执行此操作?
我想解决这个问题的方法是拥有一个可以链接到所有主题标签的TTTAttributedLabel。有一个UITapGestureRecognizer附加到TTTAttributedLabel,因此如果没有按下hashtag,它会触发位于TTTAttributedLabel后面的UITextView来显示键盘。 UITextView填充空格以将类型指示器移动到正确的位置。这是很多工作 - 想知道是否有人有一个更整洁的解决方案。
答案 0 :(得分:0)
嗯,这是:
- (void)viewDidLoad
{
[super viewDidLoad];
self.post = [UITextView new];
self.post.autocorrectionType = UITextAutocorrectionTypeNo;
self.post.autocapitalizationType = UITextAutocapitalizationTypeNone;
self.post.frame = Frame(304,250,734,458);
// message.backgroundColor = [UIColor blueColor];
self.post.delegate = self;
self.post.font = [UIFont fontWithName:@"AauxProOT-Regular" size:Normalize(40)];
// self.post.textColor = [UIColor colorWithRed:(73/255.0) green:(73/255.0) blue:(73/255.0) alpha:1];
self.post.backgroundColor = [UIColor clearColor];
self.post.keyboardType = UIKeyboardTypeTwitter;
[self.view addSubview:self.post];
}
- (void)textViewDidChange:(UITextView *)textView
{
if (self.post.text.length == 0)
{
// USER HAS DELETED ALL TEXT
self.post.text = @"#";
return;
}
if ([[self.post.text substringFromIndex:[self.post.text length] - 2] isEqualToString:@"# "])
{
self.post.text = [self.post.text substringToIndex:[self.post.text length] - 1];
return;
}
if (self.post.text.length > 1 && [[self.post.text substringFromIndex:[self.post.text length] - 1] isEqualToString:@"#"])
{
self.post.text = [self.post.text substringToIndex:[self.post.text length] - 1];
return;
}
if ([[self.post.text substringFromIndex:[self.post.text length] - 2] isEqualToString:@"X "])
{
self.post.text = [NSString stringWithFormat:@"%@%@", self.post.text, @"#"];
}
else if ([[self.post.text substringFromIndex:[self.post.text length] - 1] isEqualToString:@" "])
{
// COMPLETE NEW HASHTAG
self.post.text = [self.post.text substringToIndex:[self.post.text length] - 1];
self.post.text = [NSString stringWithFormat:@"%@%@", self.post.text, @" X #"];
}
if ([self.post.text rangeOfString:@" X #"].location != NSNotFound)
[self formatHashtags];
}
- (void)textViewDidChangeSelection:(UITextView *)textView
{
NSRange selectedRange = textView.selectedRange;
if (selectedRange.location < self.post.text.length)
{
NSError *error = NULL;
NSRegularExpression *hashTagRegex = [NSRegularExpression regularExpressionWithPattern:@"#(\\w+)[ ]X[ ]" options:NSRegularExpressionCaseInsensitive error:&error];
// NSMutableArray *ranges = [NSMutableArray new];
[hashTagRegex enumerateMatchesInString:self.post.text options:0 range:NSMakeRange(0, [self.post.text length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){
NSRange matchedRange = [match rangeAtIndex:1];
// [ranges addObject:selectedRange];
matchedRange.location = matchedRange.location - 1;
matchedRange.length = matchedRange.length + 3;
if (selectedRange.location >= matchedRange.location && selectedRange.location <= (matchedRange.location + matchedRange.length))
{
NSString* part1 = [self.post.text substringToIndex:matchedRange.location];
NSString* part2 = [self.post.text substringFromIndex:matchedRange.location+matchedRange.length + 1];
self.post.text = [part1 stringByAppendingString:part2];
}
}];
textView.selectedRange = NSMakeRange(self.post.text.length, 0);
[self formatHashtags];
}
}
-(void)formatHashtags
{
NSMutableAttributedString *originalMutableAttributedString = [[NSMutableAttributedString alloc]initWithAttributedString:self.post.attributedText];
NSRange originalRange = NSMakeRange(0, originalMutableAttributedString.length);
[originalMutableAttributedString setAttributes:@{} range:originalRange];
// [[originalMutableAttributedString mutableString] setString:@""];
self.post.attributedText = originalMutableAttributedString;
NSError *error = NULL;
NSRegularExpression *hashTagRegex = [NSRegularExpression regularExpressionWithPattern:@"#(\\w+) X " options:NSRegularExpressionCaseInsensitive error:&error];
// NSMutableArray *ranges = [NSMutableArray new];
[hashTagRegex enumerateMatchesInString:self.post.text options:0 range:NSMakeRange(0, [self.post.text length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){
NSRange selectedRange = [match rangeAtIndex:1];
// [ranges addObject:selectedRange];
selectedRange.location = selectedRange.location - 1;
selectedRange.length = selectedRange.length + 3;
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]initWithAttributedString:self.post.attributedText];
[attributedString addAttribute:NSBackgroundColorAttributeName
value:[UIColor colorWithRed:(173/255.0) green:(173/255.0) blue:(173/255.0) alpha:1]
range:selectedRange];
self.post.attributedText = attributedString;
}];
error = NULL;
NSRegularExpression *xes = [NSRegularExpression regularExpressionWithPattern:@"X[ ]#" options:NSRegularExpressionCaseInsensitive error:&error];
// NSMutableArray *ranges = [NSMutableArray new];
[xes enumerateMatchesInString:self.post.text options:0 range:NSMakeRange(0, [self.post.text length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){
NSRange selectedRange = [match rangeAtIndex:0];
// [ranges addObject:selectedRange];
selectedRange.length = 1;
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]initWithAttributedString:self.post.attributedText];
[attributedString addAttribute:NSFontAttributeName
value:[UIFont fontWithName:@"Arial-BoldMT" size:Normalize(35)]
range:selectedRange];
self.post.attributedText = attributedString;
}];
}