سؤال

لدي بعض في معالج اللمس الذي يستجيب للنقرة على وجهة نظر أنني رسمت بعض النص المنسوب فيه. من خلال هذا ، وصلت إلى النقطة التي لديّ CTRunRef (والخط المرتبط) وكذلك عدد الحروف الرسومية في هذا التشغيل.

ما لم أتمكن من اكتشافه بسهولة ، هو كيف يمكنني أن أتناول هذه الأسلوب الحرفي ، وبالنظر إلى السلسلة المنسوبة ، قم بتخطيطها إلى الأحرف في السلسلة.

على وجه التحديد ، المشكلة هي أنني أرغب في معرفة الكلمة التي استغلها المستخدم في العرض ، حتى أتمكن من معالجة ما إذا كانت هذه الكلمة عبارة عن عنوان URL وإطلاق طريقة مندوب مخصص حتى أتمكن من فتح عرض ويب معه. لديّ جميع الأساسيات المحتملة ، لا أعرف كيفية تعيين المكان الذي استغله المستخدم في فرعية معينة.

أي مساعدة سيكون موضع تقدير كبير.

تحديث: لقد ذهبت بالفعل وفعلت ذلك بطريقة مختلفة ، بناءً على اقتراح شخص آخر من Stackoverflow. في الأساس ما فعلته هو تعيين سمة مخصصة ، @"MyAppLinkAddress" مع قيمة عنوان URL الذي وجدته عندما كنت أقوم بتحويل السلسلة إلى سلسلة نسبية. يحدث هذا قبل أن أرسم السلسلة. لذلك ، عندما يحدث حدث TAP ، أتحقق فقط من وجود هذه السمة ، وإذا كان الأمر كذلك ، اتصل بأسلوب المندوب الخاص بي ، إن لم يكن ، فقط تجاهلها. إنه يعمل ما أرغب الآن ، لكنني سأترك هذا السؤال مفتوحًا لبضعة أيام أخرى ، إذا كان بإمكان شخص ما التوصل إلى إجابة ، سأقبله بسعادة إذا كان حلًا يعمل قد تكون قادرة على العثور على هذه المعلومات مفيدة في مرحلة ما في المستقبل.

هل كانت مفيدة؟

المحلول

لذلك كما ذكرت في التحديث ، اخترت أن أذهب إلى طريق مختلف. بدلاً من ذلك ، حصلت على فكرة لاستخدام سمة مخصصة في السلسلة المنسوبة لتحديد الرابط الخاص بي ، لأنني حصلت عليه في وقت الإنشاء على أي حال. لذلك فعلت ذلك. ثم في معالج اللمس الخاص بي ، عندما يتم استغلال الجري ، أتحقق مما إذا كان هذا التشغيل يحتوي على تلك السمة ، وإذا كان الأمر كذلك ، اتصل بمندوبي معه. من هناك ، أقوم بتحميل عرض ويب بسعادة مع عنوان URL هذا.

تعديل: فيما يلي مقتطفات من التعليمات البرمجية التي تشرح ما فعلته في هذه الإجابة. يتمتع.

// When creating the attribute on your text store. Assumes you have the URL already. 
// Filled in for convenience
NSRange urlRange = [tmpString rangeOfString:@"http://www.foo.com/"];
[self.textStore addAttribute:(NSString*)kCTForegroundColorAttributeName value:(id)[UIColor blueColor].CGColor range:urlRange];
[self.textStore addAttribute:@"CustomLinkAddress" value:urlString range:urlRange];

من ثم...

// Touch handling code — Uses gesture recognizers, not old school touch handling.
// This is just a dump of code actually in use, read through it, ask questions if you
// don't understand it. I'll do my best to put it in context.
- (void)receivedTap:(UITapGestureRecognizer*)tapRecognizer
{
        CGPoint point = [tapRecognizer locationInView:self];

        if(CGRectContainsPoint(textRect, point))
        {
                CGContextRef context = UIGraphicsGetCurrentContext();

                point.y = CGRectGetHeight(self.contentView.bounds) - kCellNameLabelHeight - point.y;

                CFArrayRef lines = CTFrameGetLines(ctframe);
                CFIndex lineCount = CFArrayGetCount(lines);
                CGPoint origins[lineCount];
                CTFrameGetLineOrigins(ctframe, CFRangeMake(0, 0), origins);
                for(CFIndex idx = 0; idx < lineCount; idx++)
                {
                        CTLineRef line = CFArrayGetValueAtIndex(lines, idx);
                        CGRect lineBounds = CTLineGetImageBounds(line, context);
                        lineBounds.origin.y += origins[idx].y;

                        if(CGRectContainsPoint(lineBounds, point))
                        {
                                CFArrayRef runs = CTLineGetGlyphRuns(line);
                                for(CFIndex j = 0; j < CFArrayGetCount(runs); j++)
                                {
                                        CTRunRef run = CFArrayGetValueAtIndex(runs, j);
                                        NSDictionary* attributes = (NSDictionary*)CTRunGetAttributes(run);
                                        NSString* urlString = [attributes objectForKey:@"CustomLinkAddress"];
                                        if(urlString && ![urlString isEqualToString:@""])
                                        {
                                                [self.delegate didReceiveURL:[NSURL URLWithString:urlString]];
                                                UIGraphicsPopContext();
                                                return;
                                        }
                                }
                        }
                }
                UIGraphicsPopContext();
        }
}

نصائح أخرى

بعد العثور على السطر المنقذ ، يمكنك طلب الفهرس في السلسلة عن طريق الاتصال CTLineGetStringIndexForPosition(). ليست هناك حاجة للوصول إلى أشواط فردية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top