আইওএস 7 টেক্সটকিট - টেক্সটের সাথে ইনলাইন চিত্রগুলি কীভাবে সন্নিবেশ করা যায়?


109

আমি ইউআইটিেক্সটভিউ ব্যবহার করে নিম্নলিখিত প্রভাবটি পাওয়ার চেষ্টা করছি:

এখানে চিত্র বর্ণনা লিখুন

মূলত আমি পাঠ্যের মধ্যে একটি চিত্র সন্নিবেশ করতে চাই। চিত্রটি কেবলমাত্র 1 সারি স্থান নিতে পারে যাতে কোনও মোড়ানো প্রয়োজন হয় না।

আমি কেবলমাত্র সাবউইউতে একটি ইউআইভিউউ যুক্ত করার চেষ্টা করেছি:

UIView *pictureView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 25, 25)];
[pictureView setBackgroundColor:[UIColor redColor]];
[self.textView addSubview:pictureView];

তবে মনে হচ্ছে এটি পাঠ্যের উপরে ভেসে উঠেছে এবং এটি আবরণ করেছে।

আমি বাদ দেওয়ার পথে কিছুটা পড়লাম যা এটি বাস্তবায়নের এক উপায় বলে মনে হয়। যাইহোক, আমি চিত্রটি একেবারে স্থিত করতে চাই না - পরিবর্তে, এটি পাঠ্যের সাথে প্রবাহিত হওয়া উচিত ( <span>এইচটিএমএলতে কীভাবে আচরণ করা হয় তার অনুরূপ )।


উত্তরগুলির মধ্যে কয়েকটি এনএসটিেক্সট এটাকমেন্ট এবং এনএসটিেক্সটফিল্ডে চিত্রের বৈশিষ্ট্যগুলি ব্যবহার করে উল্লিখিত হয়েছে তবে আমি উল্লেখ করতে চাই যে আমার এমন একটি সমাধান প্রয়োজন যা আমাকে একটি ইউআইভিউ যুক্ত করার অনুমতি দেয়।
অ্যান্ডি হিন

5
আশ্চর্যজনক যে আমি আজ সকালে রয়্যাল রাম্বল 2011 দেখেছি (যেখানে আপনার চিত্রটি ডাব্লুডাব্লুইই নেটওয়ার্কের মাধ্যমে ধরা হয়েছিল) এবং এখানেই আজ আমি এই প্রশ্নটি করছি।
বিপাপা

হিয়া, আপনি কি টেক্সটএটাচমেন্টের সাথে জড়িত কিছু ওয়ার্কিং কোডের উদাহরণ পেয়েছেন?
ফতুহোকু

উত্তর:


180

আপনাকে একটি বিশিষ্ট স্ট্রিং ব্যবহার করতে হবে এবং চিত্রটি উদাহরণ হিসাবে যুক্ত করতে হবে NSTextAttachment:

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:@"like after"];

NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];
textAttachment.image = [UIImage imageNamed:@"whatever.png"];

NSAttributedString *attrStringWithImage = [NSAttributedString attributedStringWithAttachment:textAttachment];

[attributedString replaceCharactersInRange:NSMakeRange(4, 1) withAttributedString:attrStringWithImage];

4
আমি মনে করি এটি এখন পর্যন্ত সবচেয়ে কাছের উত্তর। এই একই কৌশলটি কি ইউআইআইভিউজের পরিবর্তে ইউআইভিউয়ের সাথে ব্যবহার করা সম্ভব?
অ্যান্ডি হিন


6
আমি কীভাবে এনএসটিেক্সট আটকটি পুনরায় আকার দেব?
jsetting32

2
@ বিলোব্যাটাম, আমি পাঠ্যদর্শনটিতে একাধিক চিত্র যুক্ত করতে চাই। তাহলে আমি কীভাবে যুক্ত করতে পারি?
ডিকেন শাহ

3
`[বিশিষ্ট স্ট্রিং sertোকানঅ্যাট্রিবিউটেড স্ট্রিং: টেক্সটএটাচমেন্ট এআইন্ডেক্স: 4] than এর চেয়ে ভালreplaceCharactersInRange
ডনসং

26

@ বিলোবাটমের কোড অভাবীদের জন্য সুইফটে রূপান্তরিত হয়েছে:

let attributedString = NSMutableAttributedString(string: "like after")

let textAttachment = NSTextAttachment()

textAttachment.image = UIImage(named: "whatever.png")

let attrStringWithImage = NSAttributedString(attachment: textAttachment)

attributedString.replaceCharacters(in: NSMakeRange(4, 1), with: attrStringWithImage)

20

আপনি এনএসএট্রিবিউটেড স্ট্রিং এবং এনএসটিেক্সট অ্যাটাকমেন্ট ব্যবহার করে দেখতে পারেন। চিত্রটি পুনরায় আকার দিতে NSTextAttachment টি অনুকূলিতকরণ সম্পর্কিত আরও তথ্যের জন্য নীচের লিঙ্কটি একবার দেখুন। http://ossh.com.au/design-and-technology/software-development/implementing-rich-text-with-images-on-os-x-and-ios/

আমার উদাহরণে আমি প্রস্থের মাপসই করতে চিত্রটিকে পুনরায় আকার দিচ্ছি, আপনার ক্ষেত্রে আপনি লাইন উচ্চতার সাথে মেলে চিত্রটির আকার পরিবর্তন করতে পারেন।


আমি মনে করি এটি এখন পর্যন্ত সবচেয়ে কাছের উত্তর। এই একই কৌশলটি কি ইউআইআইভিউজের পরিবর্তে ইউআইভিউয়ের সাথে ব্যবহার করা সম্ভব?
অ্যান্ডি হিন

আপনি নিজের কাস্টম ক্লাসে কিছু বড় কাজ করতে সক্ষম হতে পারেন। NSTextAttachment এর একটি ডিফল্ট চিত্রের বৈশিষ্ট্য রয়েছে এবং সংযুক্তিটি NSAttributesString এর অংশ হিসাবে সংরক্ষণ করা হয়। আপনি সম্ভবত নিজের সাবক্ল্যাস তৈরি করতে এবং যা খুশি তা সঞ্চয় করতে পারেন। আমি মনে করি ডিসপ্লেটি কোনও চিত্র প্রদর্শন করার মধ্যেই সীমাবদ্ধ তাই কোনও ইউআইভিউ কার্যকর হবে না তা নিশ্চিত। আমি লেআউটটি স্মরণ করার সাথে সাথে ম্যানেজার একটি চিত্র প্রত্যাশা করে।
ডানকান গ্রোনাওয়াল্ড

1
@ অ্যান্ডহিন আমি নিজেই এটি পরীক্ষা করে দেখিনি তবে একটি বিকল্প সম্ভবত আপনার একটিকে রেন্ডার UIViewকরা UIImageএবং তারপরে এটি হিসাবে যুক্ত করা সম্ভব NSTextAttachment। কোনও চিত্রের ভিউ রেন্ডার করার জন্য এই প্রশ্নটি দেখুন: http://stackoverflow.com প্রদর্শন? lq = 1
মাইকেল

এর সাথে নতুন কোন উন্নয়ন?
ফতুহোকু

5

@ বিলোবাতামের উত্তরে সম্প্রসারণ করা , এবং অন্য প্রশ্ন থেকে এই বিভাগটি ব্যবহার করা । আমি এটি রান্না করেছি:

ব্যবহার:

UILabel *labelWithImage = [UILabel new];
labelWithImage.text = @"Tap [new-button] to make a new thing!";
NSAttributedString *stringWithImage = [labelWithImage.attributedText attributedStringByReplacingOccurancesOfString:@"[new-button]" withImage:[UIImage imageNamed:@"MyNewThingButtonImage"] scale:0];
labelWithImage.attributedText = stringWithImage;

বাস্তবায়ন:

@interface NSMutableAttributedString (InlineImage)

- (void)replaceCharactersInRange:(NSRange)range withInlineImage:(UIImage *)inlineImage scale:(CGFloat)inlineImageScale;

@end

@interface NSAttributedString (InlineImages)

- (NSAttributedString *)attributedStringByReplacingOccurancesOfString:(NSString *)string withInlineImage:(UIImage *)inlineImage scale:(CGFloat)inlineImageScale;

@end

@implementation NSMutableAttributedString (InlineImages)

- (void)replaceCharactersInRange:(NSRange)range withInlineImage:(UIImage *)inlineImage scale:(CGFloat)inlineImageScale {

    if (floorf(inlineImageScale) == 0)
        inlineImageScale = 1.0f;

    // Create resized, tinted image matching font size and (text) color
    UIImage *imageMatchingFont = [inlineImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
    {
        // Font size
        NSDictionary *attributesForRange = [self attributesAtIndex:range.location effectiveRange:nil];
        UIFont *fontForRange = [attributesForRange valueForKey:NSFontAttributeName];
        CGSize imageSizeMatchingFontSize = CGSizeMake(inlineImage.size.width * (fontForRange.capHeight / inlineImage.size.height), fontForRange.capHeight);

        // Some scaling for prettiness
        CGFloat defaultScale = 1.4f;
        imageSizeMatchingFontSize = CGSizeMake(imageSizeMatchingFontSize.width * defaultScale,     imageSizeMatchingFontSize.height * defaultScale);
        imageSizeMatchingFontSize = CGSizeMake(imageSizeMatchingFontSize.width * inlineImageScale, imageSizeMatchingFontSize.height * inlineImageScale);
        imageSizeMatchingFontSize = CGSizeMake(ceilf(imageSizeMatchingFontSize.width), ceilf(imageSizeMatchingFontSize.height));

        // Text color
        UIColor *textColorForRange = [attributesForRange valueForKey:NSForegroundColorAttributeName];

        // Make the matching image
        UIGraphicsBeginImageContextWithOptions(imageSizeMatchingFontSize, NO, 0.0f);
        [textColorForRange set];
        [inlineImage drawInRect:CGRectMake(0 , 0, imageSizeMatchingFontSize.width, imageSizeMatchingFontSize.height)];
        imageMatchingFont = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }

    // Text attachment with image
    NSTextAttachment *textAttachment = [NSTextAttachment new];
    textAttachment.image = imageMatchingFont;
    NSAttributedString *imageString = [NSAttributedString attributedStringWithAttachment:textAttachment];

    [self replaceCharactersInRange:range withAttributedString:imageString];
}

@end

@implementation NSAttributedString (InlineImages)

- (NSAttributedString *)attributedStringByReplacingOccurancesOfString:(NSString *)string withInlineImage:(UIImage *)inlineImage scale:(CGFloat)inlineImageScale {

    NSMutableAttributedString *attributedStringWithImages = [self mutableCopy];

    [attributedStringWithImages.string enumerateOccurancesOfString:string usingBlock:^(NSRange substringRange, BOOL *stop) {
        [attributedStringWithImages replaceCharactersInRange:substringRange withInlineImage:inlineImage scale:inlineImageScale];

    }];

    return [attributedStringWithImages copy];
}

@end

লাইন পরিবর্তন UIFont *fontForRange = [attributesForRange valueForKey:NSFontAttributeName];করতে UIFont *fontForRange = [attributesForRange valueForKey:NSFontAttributeName] ?: [UIFont fontWithName:@"HelveticaNeue" size:12.0];ভাল হওয়া উচিত, কারণ [attributesForRange valueForKey: NSFontAttributeName] শূন্য হতে পারে যদি এটি অভিধানে সেট করা ছিল না
ভিক্টর Kwok

5

সাধারণ উদাহরণে সমস্যার সমাধান হ'ল এখানে চিত্র বর্ণনা লিখুন

let attachment = NSTextAttachment()
attachment.image = UIImage(named: "qrcode")

let iconString = NSAttributedString(attachment: attachment)
let firstString = NSMutableAttributedString(string: "scan the ")
let secondString = NSAttributedString(string: "QR code received on your phone.")

firstString.append(iconString)
firstString.append(secondString)

self.textLabel.attributedText = firstString
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.