أحرف رسم الخرائط Coretext
سؤال
لدي بعض في معالج اللمس الذي يستجيب للنقرة على وجهة نظر أنني رسمت بعض النص المنسوب فيه. من خلال هذا ، وصلت إلى النقطة التي لديّ 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()
. ليست هناك حاجة للوصول إلى أشواط فردية.