HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 在UITextView中选择一个单词大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
编辑:我想@R_504_10675@用UILabel而不是UITextView,因为我不希望突出显示使用系统范围的蓝色和’copy / SELEct all / define’popover. @H_944_2@我正在尝试构建自定义文本视图,我正在寻找正确方法的一些帮助.我是一个iOS n00b,所以主要是寻找有关如何最好地解决问题的想法.

@H_944_2@我想构建一个自定义文本视图,具有以下行为:

@H_944_2@>视图从小开始.如果它收到一个点击它会增长(动画)为父视图的大小作为模态窗口(左上图,然后右上图)
>在这个大状态中,如果单击一个单词,则单词以某种方式突出显示,并且委托方法称为传递包含被轻敲的字符串的字符串(左下图)

@H_944_2@New Text View http://telliott.net/static/NewTextView.png

@H_944_2@我怀疑复杂性将在于识别被点击的单词,所以让我们从那里开始.我可以想到几种尝试这种方法

@H_944_2@> UILabel子类.添加触摸手势识别器.识别触摸时,以某种方式获取触摸点的(x.y)坐标,查看视图显示的字符串,并根据位置确定必须按下哪个字.然而,我可以通过自动换行很快看到这变得非常复杂.我不确定如何获得触摸的(x,y)坐标(然我认为这很简单),或者如何获得每个角色等设备相关的文本宽度.我宁愿不去这条路线,除非有人可以说服我这不会太可怕!
> UIView子类,并通过为每个单词添加UILabel来伪造句子.测量每个UILabel的宽度并自己铺设.这似乎是一种更明智的方法,然我担心以这种方式布置文本也比我开始尝试时的想法更难.

@H_944_2@有更明智的方法吗?你可以用其他方式检索UILabel中触及的单词吗?

@H_944_2@如果我选择选项2,那么我认为动画来自小 – >大文本可能很复杂,因为单词将以有趣的方式包装.所以我想要另一个子视图 – 这次是UITextView – 将句子保持在小状态.将此动画设置为大,然后将其隐藏,同时以每个单词的一个视图显示我的UIView.

@H_944_2@任何想法都赞赏.提前致谢 :)

解决方法

更新 @H_944_2@由于在CoreText中添加了NSLayoutManager,因此iOS 7更容易实现.如果您正在处理UITextView,则可以将布局管理器作为视图的属性进行访问.在我的情况下,我想坚持使用UILabel,所以你必须创建一个大小相同的布局管理器,即:

NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:labelText];
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
[textStorage addLayoutManager:layoutManager];
CGRect bounds = label.bounds;
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:bounds.size];
[layoutManager addTextContainer:textContainer];@H_607_29@ 
 @H_944_2@现在你只需要找到被点击的字符的索引,这很简单!

NSUInteger characterIndex = [layoutManager characterIndexForPoint:LOCATIOn
                                                  intextContainer:textContainer
                         fractionOfDistancebetweenInsertionPoints:NULL];@H_607_29@ 
 @H_944_2@这使得找到这个词本身变得微不足道:

if (characterIndex < textStorage.length) {
  [labelText.String enumerateSubStringsInRange:NsmakeRange(0,textStorage.length)
                                       options:NSStringEnumerationByWords
                                    usingBlock:^(NSString *subString,NSRange subStringRange,NSRange enclosingRange,BOOL *stop) {
                                      if (NSLOCATIOnInRange(characterIndex,enclosingRangE)) {
                                        // Do your thing with the word,at range 'enclosingRange'
                                        *stop = YES;
                                      }
                                    }];
}@H_607_29@ 
 @H_944_2@原始答案,适用于iOS< 7 感谢@JP Hribovsek提供了一些有关此工作的提示,我设法为我的目的解决了这个问题.它感觉有点hacky,对于大型文本可能不会很好,但对于一次一段(这是我需要的),它很好. 我创建了一个简单的UILabel子类,允许我设置插入值: 

#import "WWLabel.h"

#define WWLabelDefaulTinset 5

@implementation WWLabel

@synthesize topInset,lefTinset,bottomInset,righTinset;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.topInset = WWLabelDefaulTinset;
        self.bottomInset = WWLabelDefaulTinset;
        self.righTinset = WWLabelDefaulTinset;
        self.lefTinset = WWLabelDefaulTinset;
    }
    return self;
}

- (void)drawTexTinRect:(CGRect)rect
{
    UIEdgeInsets insets = {self.topInset,self.lefTinset,self.bottomInset,self.righTinset};

    return [super drawTexTinRect:UIEdgeInsetsInsetRect(rect,insets)];
}@H_607_29@ 
 @H_944_2@然后我创建了一个包含我的自定义标签的UIView子类,然后在标签上构建了标签中每个单词的文本大小,直到大小超过了点击位置的大小 – 这是被点击的单词.这不是完美的,但现在效果还不错.

@H_944_2@然后我使用一个简单的NSAttributedString来突出显示文本:

#import "WWPhoneticTextView.h"
#import "WWLabel.h"

#define WWPhoneticTextViewInset 5
#define WWPhoneticTextViewDefaultColor [UIColor blackColor]
#define WWPhoneticTextViewHighLightcolor [UIColor yellowColor]

#define UILabelMagicTopMargin 5
#define UILabelMagicLeftMargin -5

@implementation WWPhoneticTextView {
    WWLabel *label;
    NSMutableAttributedString *labelText;
    NSRange tappedRange;
}

// ... skipped init methods,very simple,just call through to configureView

- (void)configureView
{
    if(!label) {
        tappedRange.LOCATIOn = NsnotFound;
        tappedRange.length = 0;

        label = [[WWLabel alloc] initWithFrame:[self bounds]];
        [label setLineBreakmode:NSLineBreakByWordWrapping];
        [label setnumberOfLines:0];
        [label setBACkgroundColor:[UIColor clearColor]];
        [label setTopInset:WWPhoneticTextViewInset];
        [label setLefTinset:WWPhoneticTextViewInset];
        [label setBottomInset:WWPhoneticTextViewInset];
        [label setrighTinset:WWPhoneticTextViewInset];

        [self addSubview:label];
    }


    // Setup tap handling
    UITapGestureRecognizer *singleFingerTap = [[UITapGestureRecognizer alloc]
                                               initWithTarget:self action:@SELEctor(handleSingleTap:)];
    singleFingerTap.numberOfTapsrequired = 1;
    [self addGestureRecognizer:singleFingerTap];
}

- (void)setText:(NSString *)text
{
    labelText = [[NSMutableAttributedString alloc] initWithString:text];
    [label setAttributedText:labelText];
}

- (void)handleSingleTap:(UITapGestureRecognizer *)sender
{
    if (sender.state == UIGestureRecognizerStateEnded)
    {
        // Get the LOCATIOn of the tap,and normalise for the text view (no margins)
        CGPoint tapPoint = [sender LOCATIOnInView:sender.view];
        tapPoint.x = tapPoint.x - WWPhoneticTextViewInset - UILabelMagicLeftMargin;
        tapPoint.y = tapPoint.y - WWPhoneticTextViewInset - UILabelMagicTopMargin;

        // Iterate over each word,and check if the word contains the tap point in the correct line
        __block NSString *partialString = @"";
        __block NSString *lineString = @"";
        __block int currentLineHeight = label.font.pointSize;
        [label.text enumerateSubStringsInRange:NsmakeRange(0,[label.text length]) options:NSStringEnumerationByWords usingBlock:^(NSString* word,NSRange wordRange,BOOL* stop){

            CGSize sizeForText = CGSizeMake(label.frame.size.width-2*WWPhoneticTextViewInset,label.frame.size.height-2*WWPhoneticTextViewInset);
            partialString = [NSString StringWithFormat:@"%@ %@",partialString,word];

            // Find the size of the partial String,and stop if we've hit the word
            CGSize partialStringSize  = [partialString sizeWithFont:label.font consTrainedToSize:sizeForText lineBreakmode:label.lineBreakmode];

            if (partialStringSize.height > currentLineHeight) {
                // Text wrapped to new line
                currentLineHeight = partialStringSize.height;
                lineString = @"";
            }
            lineString = [NSString StringWithFormat:@"%@ %@",lineString,word];

            CGSize lineStringSize  = [lineString sizeWithFont:label.font consTrainedToSize:label.frame.size lineBreakmode:label.lineBreakmode];
            lineStringSize.width = lineStringSize.width + WWPhoneticTextViewInset;

            if (tapPoint.x < lineStringSize.width && tapPoint.y > (partialStringSize.height-label.font.pointSizE) && tapPoint.y < partialStringSize.height) {
                NSLog(@"Tapped word %@",word);
                if (tappedRange.LOCATIOn != NsnotFound) {
                    [labelText addAttribute:NSForegroundColorAttributENAME value:[UIColor blackColor] range:tappedRange];
                }

                tappedRange = wordRange;
                [labelText addAttribute:NSForegroundColorAttributENAME value:[UIColor redColor] range:tappedRange];
                [label setAttributedText:labelText];
                *stop = YES;
            }
        }];        
    }
}@H_607_29@

大佬总结

以上是大佬教程为你收集整理的ios – 在UITextView中选择一个单词全部内容,希望文章能够帮你解决ios – 在UITextView中选择一个单词所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。