আমি কীভাবে এর সামগ্রীতে একটি ইউআইটিেক্সটভিউকে আকার দেব?


521

UITextViewএর সামগ্রীর সাথে সামঞ্জস্য করার জন্য কি আকারের সামঞ্জস্য করার কোনও ভাল উপায় আছে ? উদাহরণস্বরূপ বলুন আমার কাছে একটি UITextViewরয়েছে যা পাঠ্যের একটি লাইন রয়েছে:

"Hello world"

আমি তারপরে পাঠ্যের আরও একটি লাইন যুক্ত করব:

"Goodbye world"

rectপাঠ্য দৃশ্যে সমস্ত লাইন ধরে রাখার জন্য কোকো টাচ-এ কোনও ভাল উপায় আছে যাতে আমি সেই অনুসারে পিতামাতার দৃষ্টিভঙ্গি সামঞ্জস্য করতে পারি?

অন্য উদাহরণ হিসাবে, ক্যালেন্ডার অ্যাপ্লিকেশনটিতে ইভেন্টগুলির জন্য নোটের ক্ষেত্রটি দেখুন - নোটের UITextViewস্ট্রিংয়ে পাঠ্যটির সমস্ত লাইন ধরে রাখার জন্য সেল কীভাবে (এবং এতে রয়েছে) কীভাবে প্রসারিত হবে তা নোট করুন।


দয়া করে সঠিক উত্তরটি আপডেট করার বিষয়টি বিবেচনা করুন, যেহেতু গৃহীত কোনওটি অহেতুক গণনার দিকে পরিচালিত করে, এখন এই সমস্যাটির জন্য একটি কন্টেন্টসাইজ সম্পত্তি রয়েছে।
জুয়ান বোয়েরো

উত্তর:


610

এটি আইওএস 6.1 এবং আইওএস 7 উভয়ের জন্যই কাজ করে:

- (void)textViewDidChange:(UITextView *)textView
{
    CGFloat fixedWidth = textView.frame.size.width;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    textView.frame = newFrame;
}

বা সুইফটে (আইওএস 11 এ সুইফট 4.1 এর সাথে কাজ করে)

let fixedWidth = textView.frame.size.width
let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
textView.frame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)

আপনি যদি আইওএস 6.1 এর জন্য সমর্থন চান তবে আপনারও উচিত:

textview.scrollEnabled = NO;

1
কোনও ইউআইটিবেলভিউসেলকে কোনও ইউআইটিএক্সেক্সটভিউকে পুনরায় আকার দিতে আইওএস 7-তে পরীক্ষা করা হয়েছে। সত্যিই দুর্দান্ত কাজ করে। এই একমাত্র উত্তর যা শেষ পর্যন্ত আমার পক্ষে কাজ করেছিল। ধন্যবাদ!
অ্যালেক্স

37
textview.scrollEnabled = NO;আইওএস even.
ব্রায়ান

19
আমি CGFLOAT_MAXপরিবর্তে ম্যাক্রো ব্যবহার করার পরামর্শ দিচ্ছি MAXFLOAT। উভয় 32/64 বিট প্ল্যাটফর্মের উপর উপযুক্ত।
ইওনিল

2
পরের লাইনে enteringোকার আগে যিনি সামান্য ওঠানামার মুখোমুখি হন তিনি এই `NSRange নীচে = এনএসমেকরেঞ্জ (টেক্সটভিউ.টেক্সট.লেন্থ -1, 1) যুক্ত করুন; [পাঠ্য দেখুন স্ক্রোলরেঞ্জ টুভিজিবল: নীচে]; `
অজয়_নাসা

4
কেন সুইফট সংস্করণে আকারThatFits (...) এ দুটি পৃথক কল রয়েছে? প্রথম লাইনটি কিসের জন্য?
নেকনারি

576

এটি আর iOS 7 বা ততোধিক কাজ করে না

UITextViewসামগ্রীটির সঠিক উচ্চতার সাথে পুনরায় আকার দেওয়ার একটি খুব সহজ উপায় আছে । এটি ব্যবহার করে করা যেতে পারে UITextView contentSize

CGRect frame = _textView.frame;
frame.size.height = _textView.contentSize.height;
_textView.frame = frame;

নোটটিতে একটি বিষয় এটা কি ঠিক contentSizeকেবল প্রাপ্তিসাধ্য পরUITextView সঙ্গে দৃশ্য যোগ করা হয়েছেaddSubview । এর আগে এটি সমানframe.size

অটো লেআউট চালু থাকলে এটি কাজ করবে না। অটো লেআউট সহ, সাধারণ পদ্ধতির sizeThatFitsপদ্ধতিটি ব্যবহার করা এবং constantউচ্চতার সীমাবদ্ধতার উপর মান আপডেট করা ।

CGSize sizeThatShouldFitTheContent = [_textView sizeThatFits:_textView.frame.size];
heightConstraint.constant = sizeThatShouldFitTheContent.height;

heightConstraint স্টোরিবোর্ডে নির্মিত উচ্চতার সীমাবদ্ধতার সাথে সম্পত্তিটিকে যুক্ত করে আপনি সাধারণত একটি আইবিউউটলেট মারফত সেটআপ করেন layout


এই আশ্চর্যজনক উত্তরটি যোগ করার জন্য, 2014, আপনি যদি:

[self.textView sizeToFit];

শুধুমাত্র আইফোন 6 + এর সাথে আচরণের মধ্যে পার্থক্য রয়েছে :

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

কেবল 6+ (5 বা 6 নয়) এর সাহায্যে এটি ইউআইটিেক্সটভিউতে "আরও একটি ফাঁকা রেখা" যুক্ত করে। "আরএল সমাধান" এটি পুরোপুরি ঠিক করে:

CGRect _f = self.mainPostText.frame;
_f.size.height = self.mainPostText.contentSize.height;
self.mainPostText.frame = _f;

এটি 6+ এর "অতিরিক্ত লাইন" সমস্যাটি সমাধান করে।


2
আপনি আমার দিন বাঁচিয়েছেন। আমি ভুলে গিয়ে সেলফ্যালকুলেটিং ক্লাস ফাংশন এক্সটেনশনের সাথে লড়াই করছিলাম। ধন্যবাদ.
লুকাসজ

4
আহা! আমি পাঠ্য প্রদর্শনের উচ্চতাটি সেট করেছিলাম এবং তারপরে থাকা ভিউটির উচ্চতা সামঞ্জস্য করছি। স্পষ্টতই যখন আমি করেছি যে পাঠ্য দেখার উচ্চতাটি সামঞ্জস্য করা হচ্ছে। ধারণক্ষমতার উচ্চতা নির্ধারণ করে প্রথমে জিনিসগুলি প্রত্যাশার মতো কাজ করে (বা, আরও ভাল, আশা করা যায়)।
হট লিকস

11
[_TextView আকারToFit] ব্যবহার করে কন্টেন্টসাইজ সম্পত্তিটি রিফ্রেশ করে স্ক্রোলভিউয়ের আগে যুক্ত করার প্রয়োজনীয়তা সরিয়ে ফেলে।
রডরিগো

1
layoutIfNeededঅটোলেআউট ব্যবহার করা হলে, সুপারভিউতে কল করুন। তারপরে আপনি উচ্চতাটি দখল করতে পারেন contentSize
ফাতেমন

4
এটি যদিও বাইরের ধারকটিকে পুনরায় আকার দেওয়ার বিষয়ে। এই আচরণটি আইওএস-এ পরিবর্তিত হয়েছে I. আমি লিঙ্কযুক্ত প্রশ্নে দেখি যেখানে আকারটিফিট এবং লেআউটআইফিডে যোগ করতে হবে।
হেনরিক এরল্যান্ডসন

93

এটির UITextViewঅভ্যন্তরে গতিশীল আকার ধারণ করতে UITableViewCell, আমি নীচের সংমিশ্রণটি আইওএস 8 এসডিকে দিয়ে এক্সকোড 6 এ কাজ করে দেখলাম:

  • একটি যোগ করুন UITextViewএকটি থেকে UITableViewCellএবং অন্যরা তা সীমাবদ্ধ
  • UITextViewএর scrollEnabledসম্পত্তি সেট করুন NO। স্ক্রোলিং সক্ষম করার সাথে, এর ফ্রেমটি UITextViewতার সামগ্রীর আকারের চেয়ে পৃথক, তবে স্ক্রোলিং অক্ষম করে, দুজনের মধ্যে একটি সম্পর্ক রয়েছে।
  • যদি আপনার টেবিলটি মূল ডিফল্ট সারি 44 এর উচ্চতা ব্যবহার করে থাকে তবে এটি স্বয়ংক্রিয়ভাবে সারি উচ্চতা গণনা করবে তবে আপনি যদি ডিফল্ট সারির উচ্চতা অন্য কোনওটিতে পরিবর্তন করেন তবে আপনাকে নিজেই এখানে সারি উচ্চতার স্বয়ংক্রিয় গণনা চালু করতে হবে viewDidLoad:

    tableView.estimatedRowHeight = 150;
    tableView.rowHeight = UITableViewAutomaticDimension;

কেবলমাত্র পঠনযোগ্য গতিশীল আকারের আকারের জন্য UITextView, এটিই। আপনি যদি ব্যবহারকারীদের পাঠ্য সম্পাদনা করার অনুমতি দিচ্ছেন তবে UITextViewআপনার এগুলিও করতে হবে:

  • প্রোটোকলের textViewDidChange:পদ্ধতিটি প্রয়োগ করুন UITextViewDelegateএবং tableViewপ্রতি বার পাঠ্য সম্পাদনা করার সময় নিজেকে পুনরায় রঙ করতে বলুন :

    - (void)textViewDidChange:(UITextView *)textView;
    {
        [tableView beginUpdates];
        [tableView endUpdates];
    }
  • এবং UITextViewডেলিগেটটি কোথাও, ভিতরে Storyboardবা ভিতরে স্থাপন করতে ভুলবেন নাtableView:cellForRowAtIndexPath:


আমার জন্য সেরা উত্তর। নিখুঁতভাবে কাজ করেছে এবং ইউআইটিএবলভিউআউটমেটিক ডাইমেনশনটি আইওএস 5 এ যুক্ত করা হয়েছিল তাই এটি পিছনের দিকে সামঞ্জস্যপূর্ণ।
স্মেলজার

4
আমার পক্ষে বেশ কাজ করেনি। পাঠ্যভিউডিডচ্যাঞ্জ পদ্ধতিটি প্রতিবার যখন আমি কোনও চরিত্র টাইপ করি তখন আমার টেবিলভিউটি বাউন করে। আমার পরামর্শটি হ'ল সেই পদ্ধতিটি ব্যবহার না করে টেবিলভিউতে: সেলফোর্ডআউটইন্ডেক্সপথ পদ্ধতিতে পাঠ্যদর্শন সহ সারিটির জন্য, আপনি যদি কেবল পঠন মোডে সেট করেন তবে স্ক্রোলএইএনএবেলড থাকে, এবং আপনি যদি সম্পাদনা দর্শন সেটটিতে থাকেন হ্যাঁ সক্রিয় স্ক্রোল। এইভাবে যখন এটি প্রদর্শিত হয় সর্বদা সম্পূর্ণ পাঠ্য প্রদর্শিত হবে এবং সম্পাদনা করার সময় এটি সম্পূর্ণ পাঠ্য দিয়ে শুরু হবে এবং আপনি আরও যোগ করার সাথে সাথে পূর্ববর্তী পাঠ্যটি শীর্ষে স্ক্রোলিংয়ের সাথে একই আকারে থাকবে
সাইমন দ্য ডাইভার

3
তদতিরিক্ত আমি খালি পাঠ্যক্ষেত্রের উচ্চতা না থাকায় এবং সম্পাদনা শুরু করতে ট্যাপ করা যায়নি বলে আমি পাঠ্যদর্শনটিতে একটি> = উচ্চতার সীমাবদ্ধতা যুক্ত করেছি।
সাইমন দ্য ডাইভার

দুর্দান্ত সমাধান। আমার জন্য, এটি tableView.rowHeight = UITableViewAutomaticDimensionঅপ্রয়োজনীয় ছিল।
ক্রিস্টোফার পিক্সলে

আবারো ধন্যবাদ ব্রেট ডোনাল্ড! আমি কীভাবে এটি করতে ভুলে গিয়েছিলাম এবং 1 বছর পরে আবার আপনার উত্তর খুঁজে পেয়েছি 😀।
এরিক কনার

74

কোড এবং স্টোরিবোর্ড উভয় ব্যবহার করে খুব সহজ ওয়ার্কিং সলিউশন।

কোড দ্বারা

textView.scrollEnabled = false

স্টোরিবোর্ড দ্বারা

স্ক্রোলিং সক্ষমটি আনচেক করুন

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

এর বাইরে কিছু করার দরকার নেই।


5
এই উত্তরটি সঠিক। স্টোরিবোর্ডে আপনার কাছে টেক্সটভিউ অটোসাইজ যেমন একটি ইউআইএলবেল রয়েছে তেমন। আমাদের যা করতে হবে তা হ'ল স্ক্রোলএইনেবলড = মিথ্যা সেট করা আছে।
pnavk

4
মূলত, এটি সঠিক: আপনি যদি অটোলেআউট সীমাবদ্ধতাগুলি ব্যবহার করেন এবং স্ক্রোলিং বন্ধ করে রাখেন তবে পুরো জিনিসটি কাজ করে।
ড্যান রোজনস্টার্ক

2
অনেক ধন্যবাদ. এটি ছিল সহজ, স্টোরিবোর্ড বা কোডে কেবল স্ক্রোলিং অক্ষম করুন, এটি লাইন 0 সহ ইউিলাবেলের মতো হবে
সমীর 105

@ মানসু .... এটি কোনও গ্যারান্টিযুক্ত সমাধান নয়, কারণ অন্তর্নিহিত সামগ্রীর আকারকে ওভাররাইড করার জন্য এমন কিছু জিনিস রয়েছে যা আপনি করতে পারেন এবং যদি আপনি দৃশ্যটি নির্ধারণের পরে পাঠ্য পরিবর্তন করেন তবে তা আপডেট না হওয়া অবধি আপডেট হবে না ওপর. তবে, টেক্সটফিল্ডে নম্বর অফফল = 0 সেট করার জন্যও এই জিনিসগুলি সত্য। যদি এটি কাজ না করে তবে আপনার সম্ভবত অন্যান্য বাধা রয়েছে যা সুস্পষ্টভাবে একটি উচ্চতা নির্ধারণ করবে।
জ্যাক টি।

2
@ আইওএস আপনি যদি উচ্চতার সীমাবদ্ধতা যুক্ত করে থাকেন তবে সীমাবদ্ধতাগুলিকে অগ্রাধিকার কম করুন অন্যথায় এটি কাজ করবে না।
অলোক

61

দ্রুত:

textView.sizeToFit()

14
তদ্ব্যতীত, আমি দেখতে পেয়েছি যে এটি কাজ করার জন্য আমাকে স্কলিংটিকে মিথ্যাতে সক্ষম করে সেট করা দরকার। textView.scrollEnabled = false
tmarkiewicz

1
আপনি TextView.sizeToFit () এর পরে TextView.layoutIfNeeded () কল করতে ভুলবেন না
ড্যানিয়েল

5
@tmarkiewicz এটি আপনার ডিভাইসের স্ক্রিনে পাঠ্যটি ফিট করে তবে এটি কাজ করবে যখন আপনার পাঠ্যটি স্ক্রিনের স্থানের চেয়ে বড় হবে। বাকী লেখাটি দেখতে আপনি এটিকে স্ক্রোল করতে সক্ষম হবেন না।
ফ্রান্সিসকো রোমেরো

এই উত্তর !!! আরও জটিল সমাধানের দরকার নেই !!! @ ফ্রেঞ্চিসকো রোমেরো কেন টেক্সটভিউটি কোনও টেবিল সেল বা কোলেকিটোন ভিউ সেলে রাখবেন না তবে আপনি সর্বদা টেবিলটি বা কলিকিটন ভিউ স্ক্রোল করতে পারেন ....
বেন স্মিথ

23

আমার (সীমাবদ্ধ) অভিজ্ঞতায়,

- (CGSize)sizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode

নিউলাইন চরিত্রগুলিকে সম্মান করে না, তাই আপনি CGSizeআসলে প্রয়োজনের চেয়ে অনেক কম সংক্ষেপে শেষ করতে পারেন ।

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size

মনে হয় নতুন লাইনের প্রতি শ্রদ্ধা জানায়।

এছাড়াও, পাঠ্যটি আসলে শীর্ষে রেন্ডার করা হয়নি UITextView। আমার কোডে, আমি পদ্ধতিগুলির UITextViewদ্বারা ফিরে আসা উচ্চতার চেয়ে 24 পিক্সেল বৃহত্তর নতুন উচ্চতা সেট করেছি sizeOfFont


3
এটি আকারটি পেয়ে যায় যেন এটি কোনও ইউআইবিবেলে টেক্সট আঁকবে। আপনি যদি সেই আকারটিকে ইউটেক্সটভিউর ফ্রেমের সাথে সেট করেন তবে আপনার এখনও এটিতে কিছু স্ক্রোলিং প্রয়োজনীয় necessary
কেভলার

22

contentSizeআইওএস 6-এ , আপনি পাঠ্যটি সেট করার পরেই ইউআইটিেক্সটভিউয়ের সম্পত্তিটি পরীক্ষা করতে পারেন । IOS7 এ, এটি আর কাজ করবে না। আপনি যদি iOS7 এর জন্য এই আচরণটি পুনরুদ্ধার করতে চান তবে নীচের কোডটি ইউআইটিেক্সটভিউয়ের একটি সাবক্লাসে রাখুন।

- (void)setText:(NSString *)text
{
    [super setText:text];

    if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
        CGRect rect = [self.textContainer.layoutManager usedRectForTextContainer:self.textContainer];
        UIEdgeInsets inset = self.textContainerInset;
        self.contentSize = UIEdgeInsetsInsetRect(rect, inset).size;
    }
}

2
আমি এই সম্পর্কে আরও কোথায় পড়তে পারি? আমি এটি সম্পর্কে iOS 7 এর আপাতদৃষ্টিতে নতুন আচরণ হিসাবে সম্পূর্ণরূপে হারিয়েছি lost
স্টিয়ান হিল্যান্ড

পরিবর্তনশীল সিজি সাইজের আকারের অর্থ কী?
টেচলো

আমি আকার সরিয়েছি, এটি সেখানে থাকার কথা ছিল না।
ফাতেমন

18

এই পয়েন্টটি পড়তে কেউ সাহসী (বা যথেষ্ট হতাশ) ক্ষেত্রে আমি পৃষ্ঠার নীচে সঠিক সমাধান পোস্ট করব।

এখানে তাদের জন্য গীটহাব রেপো রয়েছে, যারা এই সমস্ত পাঠটি পড়তে চান না: রিজাইজেবলটেক্সটভিউ

এটি আইওএস 7 (এবং আমি বিশ্বাস করি এটি আইওএস 8 এর সাথে কাজ করবে) এবং অটোলেআউট সহ কাজ করে। আপনার ম্যাজিক নম্বরগুলির দরকার নেই, লেআউট অক্ষম করুন এবং এ জাতীয় স্টাফ অক্ষম করুন। সংক্ষিপ্ত এবং মার্জিত সমাধান।

আমি মনে করি, সমস্ত সীমাবদ্ধতা সম্পর্কিত কোড updateConstraintsপদ্ধতিতে যাওয়া উচিত । সুতরাং, আসুন আমরা নিজের তৈরি করি ResizableTextView

আমাদের এখানে প্রথম যে সমস্যাটি দেখা হচ্ছে তা হ'ল viewDidLoadপদ্ধতির আগে আসল সামগ্রীর আকার জানেন না know আমরা দীর্ঘ এবং বগি রাস্তাটি নিতে পারি এবং এটি হরফ আকার, লাইন ব্রেক ইত্যাদির উপর ভিত্তি করে গণনা করতে পারি তবে আমাদের দৃ solution় সমাধান প্রয়োজন, তাই আমরা এটি করব:

CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];

সুতরাং এখন আমরা আসল বিষয়বস্তু জানি আমরা যেখানেই থাকি না কেন: আগে বা পরে viewDidLoad। এবার টেক্সটভিউতে উচ্চতার সীমাবদ্ধতা যুক্ত করুন (স্টোরিবোর্ড বা কোডের মাধ্যমে, যাই হোক না কেন)। আমরা আমাদের সাথে এই মানটি সমন্বয় করব contentSize.height:

[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
    if (constraint.firstAttribute == NSLayoutAttributeHeight) {
        constraint.constant = contentSize.height;
        *stop = YES;
    }
}];

শেষ কাজটি হ'ল সুপারক্লাসকে বলা updateConstraints

[super updateConstraints];

এখন আমাদের ক্লাসটি দেখে মনে হচ্ছে:

ResizableTextView.m

- (void) updateConstraints {
    CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];

    [self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
        if (constraint.firstAttribute == NSLayoutAttributeHeight) {
            constraint.constant = contentSize.height;
            *stop = YES;
        }
    }];

    [super updateConstraints];
}

সুন্দর এবং পরিষ্কার, তাই না? এবং আপনার নিয়ন্ত্রকগুলিতে আপনাকে সেই কোডটি মোকাবেলা করতে হবে না !

কিন্তু অপেক্ষা করো! Y না কোন অ্যানিমেশন!

আপনি সহজেই textViewপ্রসারিত করতে পরিবর্তনগুলি প্রাণবন্ত করতে পারেন । এখানে একটি উদাহরণ:

    [self.view layoutIfNeeded];
    // do your own text change here.
    self.infoTextView.text = [NSString stringWithFormat:@"%@, %@", self.infoTextView.text, self.infoTextView.text];
    [self.infoTextView setNeedsUpdateConstraints];
    [self.infoTextView updateConstraintsIfNeeded];
    [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionLayoutSubviews animations:^{
        [self.view layoutIfNeeded];
    } completion:nil];

4
ব্যবহার CGFLOAT_MAX, না FLT_MAX
রব মায়ফ

আমি আশা করি এই দুর্দান্ত সমাধানের জন্য আমি আপনাকে একাধিক ভোট দিতে পারলাম !!
স্কুটার

13

তুমি কি চেষ্টা করেছিলে [textView sizeThatFits:textView.bounds] ?

সম্পাদনা করুন: আকারThatFits আকার দেয় কিন্তু আসলে উপাদানটির আকার পরিবর্তন করে না। আমি নিশ্চিত নই যে আপনি যা চান তা যদি [textView sizeToFit]হয় বা আপনি যা চেয়েছিলেন তা যদি আরও থাকে । উভয় ক্ষেত্রেই, এটি আপনার পছন্দের সামগ্রীতে পুরোপুরি ফিট হবে কিনা তা আমি জানি না তবে এটি প্রথম চেষ্টা করার বিষয়।


2
sizetofit দিন সংরক্ষণ করে
michaelsnowden

9

অন্য পদ্ধতিটি হ'ল পদ্ধতিটি ব্যবহার করে কোনও নির্দিষ্ট স্ট্রিং গ্রহণ করবে NSString:

-(CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size

এটি প্রদত্ত ফন্টের সাথে প্রদত্ত স্ট্রিংয়ের সাথে আয়তক্ষেত্রের আকারটি দেয়। পছন্দসই প্রস্থ এবং সর্বাধিক উচ্চতা সহ একটি আকারে পাস করুন এবং তারপরে আপনি পাঠ্যের সাথে মানানসইভাবে ফিরে আসা উচ্চতার দিকে তাকান। এমন একটি সংস্করণ রয়েছে যা আপনাকে লাইন ব্রেক ব্রেকটিও নির্দিষ্ট করতে দেয়।

তারপরে আপনি ফিরিয়ে নেওয়া আকারটি নিজের দৃশ্যের আকার পরিবর্তন করতে মাপসই করতে পারেন।


8

আপনার যদি UITextViewসহজলভ্য না থাকে (উদাহরণস্বরূপ, আপনি টেবিল ভিউ সেলগুলি আকার দিচ্ছেন), আপনাকে স্ট্রিংটি পরিমাপ করে মাপটি গণনা করতে হবে, তারপরে এ এর ​​প্রতিটি পাশের 8 পিটি প্যাডিংয়ের জন্য অ্যাকাউন্টিং করতে হবে UITextView। উদাহরণস্বরূপ, আপনি যদি নিজের পাঠ্য দর্শনটির পছন্দসই প্রস্থটি জানেন এবং সংশ্লিষ্ট উচ্চতাটি নির্ধারণ করতে চান:

NSString * string = ...;
CGFloat textViewWidth = ...;
UIFont * font = ...;

CGSize size = CGSizeMake(textViewWidth - 8 - 8, 100000);
size.height = [string sizeWithFont:font constrainedToSize:size].height + 8 + 8;

এখানে, প্রতিটি 8 টি চারটি প্যাডযুক্ত প্রান্তগুলির মধ্যে একটির জন্য অ্যাকাউন্টিং করছে এবং 100000 কেবল একটি খুব বড় সর্বোচ্চ আকার হিসাবে পরিবেশন করে।

অনুশীলনে, আপনি font.leadingউচ্চতায় অতিরিক্ত যুক্ত করতে চাইতে পারেন ; এটি আপনার পাঠ্যের নীচে একটি ফাঁকা রেখা যুক্ত করেছে, যা পাঠ্যের দৃশ্যের নীচে সরাসরি দৃষ্টিভুক্ত ভারী নিয়ন্ত্রণ থাকলে আরও ভাল দেখায়।


আইওএস 8.1
লজিক

প্যাডিং আমার জন্য চাবিকাঠি ছিল
thibut noah

8

বাধা দিয়ে আমরা এটি করতে পারি।

  1. ইউআইটিেক্সটভিউয়ের জন্য উচ্চতা সীমাবদ্ধতা সেট করুন। এখানে চিত্র বর্ণনা লিখুন

2. উচ্চতা সীমাবদ্ধতার জন্য আইবিআউটলেট তৈরি করুন।

 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *txtheightconstraints;

3. আপনার পাঠ্যদর্শনটির জন্য প্রতিনিধি সেট করতে ভুলবেন না।

4।

-(void)textViewDidChange:(UITextView *)textView
{
    CGFloat fixedWidth = textView.frame.size.width;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    NSLog(@"this is updating height%@",NSStringFromCGSize(newFrame.size));
    [UIView animateWithDuration:0.2 animations:^{
                  _txtheightconstraints.constant=newFrame.size.height;
    }];

}

তারপরে আপনার সীমাবদ্ধতাটি আপডেট করুন :)


এটি একটি ফ্যান্টাস্টিক ডাক নাম!
ফ্যাটি

ধ্রুবক প্রয়োজনগুলি সেট করা [টেক্সটভিউ লেআউটআইফেনিড] অনুসরণ করা উচিত; অ্যানিমেশন ব্লকে। (অটোলেআউট অ্যানিমেশনগুলি এটির মতো করে।)
উইল

7

নিম্নলিখিত জিনিসগুলি যথেষ্ট:

  1. শুধু মনে রাখতে সেট স্ক্রলিং সক্রিয় করতে কোন আপনার জন্য UITextView:

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

  1. যথাযথভাবে অটো লেআউট সীমাবদ্ধতা সেট করুন।

আপনি এমনকি ব্যবহার করতে পারেন UITableViewAutomaticDimension


6

মাইক ম্যাকমাস্টারের উত্তরের সাথে একত্রিত হয়ে আপনি এমন কিছু করতে চাইতে পারেন:

[myTextView setDelegate: self];

...

- (void)textViewDidChange:(UITextView *)textView {
  if (myTextView == textView) {
     // it changed.  Do resizing here.
  }
}

6

আমি এর ভিতরে থাকা পাঠ্য অনুসারে একটি পাঠ্য ক্ষেত্রের উচ্চতা আকার পরিবর্তন করার একটি উপায় খুঁজে পেয়েছি এবং পাঠ্যের ক্ষেত্রের উচ্চতার উপর ভিত্তি করে নীচে একটি লেবেলও সাজিয়েছি! কোডটি এখানে।

UITextView *_textView = [[UITextView alloc] initWithFrame:CGRectMake(10, 10, 300, 10)];
NSString *str = @"This is a test text view to check the auto increment of height of a text view. This is only a test. The real data is something different.";
_textView.text = str;

[self.view addSubview:_textView];
CGRect frame = _textView.frame;
frame.size.height = _textView.contentSize.height;
_textView.frame = frame;

UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(10, 5 + frame.origin.y + frame.size.height, 300, 20)];
lbl.text = @"Hello!";
[self.view addSubview:lbl];

এখানে '5' এর মধ্যে - ইউআইএলবেলের সমন্বয় হ'ল আমি টেক্সটভিউ এবং লেবেলের মধ্যে ফাঁক চাই।
ধীরজ

6

অটোলেআউট ব্যবহার করে ছেলেরা এবং আপনার সিজেটফিটটি কাজ করছে না, তবে দয়া করে একবার আপনার প্রস্থের সীমাবদ্ধতা পরীক্ষা করুন। আপনি যদি প্রস্থের সীমাবদ্ধতাটি হারিয়ে ফেলেছিলেন তবে উচ্চতাটি সঠিক হবে।

অন্য কোনও এপিআই ব্যবহার করার দরকার নেই। কেবল একটি লাইন সমস্ত সমস্যার সমাধান করবে।

[_textView sizeToFit];

এখানে, আমি কেবল উচ্চতা নিয়েই প্রস্থকে স্থির রেখে চিন্তিত ছিলাম এবং স্টোরিবোর্ডে আমার টেক্সটভিউয়ের প্রস্থের সীমাবদ্ধতাটি হারিয়েছিলাম।

এবং এটি ছিল পরিষেবাগুলি থেকে গতিশীল সামগ্রী প্রদর্শন করা।

আশা করি এটি সাহায্য করতে পারে ..


6

আইওএস 8 দিয়ে শুরু করে, কোনও কাস্টম কোড ছাড়াই কোনও ইউআইটিেক্সটভিউকে স্বয়ংক্রিয়ভাবে পুনরায় আকার দেওয়ার জন্য কোনও ইউআইটিএবলভিয়ের স্বয়ংক্রিয় বিন্যাস বৈশিষ্ট্যগুলি ব্যবহার করা সম্ভব। আমি গিথুবে একটি প্রকল্প রেখেছি যা এটি কার্যকরভাবে দেখায়, তবে এখানে মূল কী:

  1. ইউআইটিেক্সটভিউতে অবশ্যই স্ক্রোলিং অক্ষম থাকতে হবে, যা আপনি প্রোগ্রামালি বা ইন্টারফেস নির্মাতার মাধ্যমে করতে পারেন। স্ক্রোলিং সক্ষম করা থাকলে এটির আকার পরিবর্তন হবে না কারণ স্ক্রোলিং আপনাকে বৃহত্তর সামগ্রী দেখতে দেয়।
  2. ইউআইটিএবলভিউ কনট্রোলারের জন্য ভিডিডলয়েডে আপনাকে অবশ্যই আনুমানিকরোহাইটের জন্য একটি মান নির্ধারণ করতে হবে এবং তারপরে সেট করতে rowHeightহবে UITableViewAutomaticDimension

- (void)viewDidLoad {
    [super viewDidLoad];
    self.tableView.estimatedRowHeight = self.tableView.rowHeight;
    self.tableView.rowHeight = UITableViewAutomaticDimension;
}
  1. প্রকল্পের স্থাপনার লক্ষ্য অবশ্যই আইওএস 8 বা তার বেশি হতে হবে।

1
এই জাতীয় উত্তর নিরুৎসাহিত করা হয়। আপনার এখানে প্রাসঙ্গিক কোড পোস্ট করা উচিত।
আন্তজি

5

আমি সমস্ত উত্তর পর্যালোচনা করেছি এবং সবাই স্থির প্রস্থ রেখে কেবল উচ্চতা সামঞ্জস্য করছি। আপনি যদি প্রস্থও সামঞ্জস্য করতে চান তবে আপনি খুব সহজেই এই পদ্ধতিটি ব্যবহার করতে পারেন:

সুতরাং আপনার পাঠ্য দর্শনটি কনফিগার করার সময় সেট স্ক্রোল অক্ষম করে

textView.isScrollEnabled = false

এবং তারপরে ডেলিগেট পদ্ধতিতে func textViewDidChange(_ textView: UITextView)এই কোডটি যুক্ত করুন:

func textViewDidChange(_ textView: UITextView) {
    let newSize = textView.sizeThatFits(CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude))
    textView.frame = CGRect(origin: textView.frame.origin, size: newSize)
}

আউটপুট:

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

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


প্রতিনিধি পদ্ধতিটি @ পিটার স্ট্যাজার
মানসুউ

4

এটি নির্দিষ্টভাবে কাজ করেছিল যখন UITextViewনির্দিষ্ট ক্ষেত্রের জন্য আমার পাঠ্য তৈরি করতে হবে :

// পাঠ্যটি অবশ্যই সাবউভিউতে যুক্ত করা উচিত, বা কন্টেন্টভিউসাইজ করা ভুল হবে।

- (অকার্যকর) হ্রাসফন্টটোফিট: (ইউআইটিেক্সটভিউ *) টিভি {
    ইউআইফন্ট * ফন্ট = টিভি.ফন্ট;
    ডাবল পয়েন্টসাইজ = ফন্ট.পয়েন্টসাইজ;

    যখন (tv.contentSize.height> tv.frame.size.height && pointSize> 7.0) {
        পয়েন্ট সাইজ - = 1.0;
        UIFont * newFont = [UIFont fontWithName: font.fontName আকার: pointSize];
        tv.font = newFont;
    }
    যদি (pointSize! = font.PointSize)
        এনএসএলগ (@ "ফন্টটি% .1f থেকে% .1f এ", পয়েন্ট সাইজ, টিভি.ফন্ট.পয়েন্টসাইজ);
}

4

এখানে @ জাইবার্ডের দ্রুততম সংস্করণ

    let cell:MsgTableViewCell! = self.tableView.dequeueReusableCellWithIdentifier("MsgTableViewCell", forIndexPath: indexPath) as? MsgTableViewCell
    cell.msgText.text = self.items[indexPath.row]
    var fixedWidth:CGFloat = cell.msgText.frame.size.width
    var size:CGSize = CGSize(width: fixedWidth,height: CGFloat.max)
    var newSize:CGSize = cell.msgText.sizeThatFits(size)
    var newFrame:CGRect = cell.msgText.frame;
    newFrame.size = CGSizeMake(CGFloat(fmaxf(Float(newSize.width), Float(fixedWidth))), newSize.height);
    cell.msgText.frame = newFrame
    cell.msgText.frame.size = newSize        
    return cell

6
প্রশ্নটি সত্যই ভাষা অজ্ঞায়নের। ইউআইকিট সম্পর্কিত প্রশ্নের উত্তরগুলির জন্য ফিরে গিয়ে সুইফট পোর্টগুলি লিখতে সত্যিই কি দরকার? দেখে মনে হচ্ছে এটি একটি কোলাহলপূর্ণ কথোপকথনের জন্য।
এমারিজিট

এই সমস্যার বেশিরভাগ প্রশ্নের কোনও নির্দিষ্ট প্রোগ্রামিং ল্যাঙ্গুয়েজ নেই তাই আপনি
গিগাবাইটে

4

স্ক্রোলিং অক্ষম করুন

বাধা যুক্ত করুন add

এবং আপনার পাঠ্য যোগ করুন

[yourTextView setText:@"your text"];
[yourTextView layoutIfNeeded];

আপনি যদি এটি ব্যবহার করেন তবে আপনার UIScrollViewএটিও যুক্ত করা উচিত;

[yourScrollView layoutIfNeeded];

-(void)viewDidAppear:(BOOL)animated{
    CGRect contentRect = CGRectZero;

    for (UIView *view in self.yourScrollView.subviews) {
         contentRect = CGRectUnion(contentRect, view.frame);
    }
    self.yourScrollView.contentSize = contentRect.size;
}


2

ইউআইটিেক্সটভিউ ডেলেগেট ব্যবহার করা সহজতম উপায়:

func textViewDidChange(_ textView: UITextView) {
    textView.sizeToFit()
    textviewHeight.constant = textView.contentSize.height
}

1

আশাকরি এটা সাহায্য করবে:

- (void)textViewDidChange:(UITextView *)textView {
  CGSize textSize = textview.contentSize;
  if (textSize != textView.frame.size)
      textView.frame.size = textSize;
}

এটি কাজ করে না! এটি একটি ত্রুটির কারণ: "কার্যপালনের বাম অপারেন্ড হিসাবে মূল্য"
লিবিয়াথন

আপনি কেবল নিয়োগ করতে পারেন textView.frame
jweyrich

1

অন্য কেউ যদি এখানে পান তবে এই সমাধানটি আমার জন্য কাজ করবে, 1 "রনি লিউ" +4 "ব্যবহারকারীর 63934" (আমার পাঠ্য ওয়েব পরিষেবাদি থেকে আগত): 1000 নোট করুন (কিছুই আমার ক্ষেত্রে "এত বড় হতে পারে না")

UIFont *fontNormal = [UIFont fontWithName:FONTNAME size:FONTSIZE];

NSString *dealDescription = [client objectForKey:@"description"];

//4
CGSize textSize = [dealDescription sizeWithFont:fontNormal constrainedToSize:CGSizeMake(containerUIView.frame.size.width, 1000)];

CGRect dealDescRect = CGRectMake(10, 300, containerUIView.frame.size.width, textSize.height);

UITextView *dealDesc = [[[UITextView alloc] initWithFrame:dealDescRect] autorelease];

dealDesc.text = dealDescription;
//add the subview to the container
[containerUIView addSubview:dealDesc];

//1) after adding the view
CGRect frame = dealDesc.frame;
frame.size.height = dealDesc.contentSize.height;
dealDesc.frame = frame;

এবং এটি ... চিয়ার্স


1

পাঠ্যের আকার অনুসারে ইউআইটিেক্সটভিউয়ের উচ্চতা পুনরায় আকারের জন্য আমি খুঁজে পেয়েছি সেরা উপায়।

CGSize textViewSize = [YOURTEXTVIEW.text sizeWithFont:[UIFont fontWithName:@"SAMPLE_FONT" size:14.0]
                       constrainedToSize:CGSizeMake(YOURTEXTVIEW.frame.size.width, FLT_MAX)];

অথবা আপনি ব্যবহার করতে পারেন

CGSize textViewSize = [YOURTEXTVIEW.text sizeWithFont:[UIFont fontWithName:@"SAMPLE_FONT" size:14.0]
                       constrainedToSize:CGSizeMake(YOURTEXTVIEW.frame.size.width, FLT_MAX) lineBreakMode:NSLineBreakByTruncatingTail];

1

যাঁরা পাঠ্যদর্শনটি চান তারা আসলে নীচের লাইনের অবস্থানটি উপরে উঠতে এবং বজায় রাখতে পারে

CGRect frame = textView.frame;
frame.size.height = textView.contentSize.height;

if(frame.size.height > textView.frame.size.height){
    CGFloat diff = frame.size.height - textView.frame.size.height;
    textView.frame = CGRectMake(0, textView.frame.origin.y - diff, textView.frame.size.width, frame.size.height);
}
else if(frame.size.height < textView.frame.size.height){
    CGFloat diff = textView.frame.size.height - frame.size.height;
    textView.frame = CGRectMake(0, textView.frame.origin.y + diff, textView.frame.size.width, frame.size.height);
}

1

কেবলমাত্র সেই কোডটিই কাজ করবে যা উপরের ঝিবার্ড উত্তরের মতো 'সাইজটোফিট' ব্যবহার করে তবে বাস্তবে আপনি ভিডিড অ্যাপায়ারে কল না করা বা এটি ইউআইটিেক্সটভিউ পাঠ্য পরিবর্তিত ইভেন্টে তারযুক্ত না করা অবধি গ্রহণযোগ্য হবে না।


1

নিকিতা টুকের উত্তরের ভিত্তিতে আমি সুইফটে নিম্নলিখিত সমাধানে এসেছি যা অটোলেআউট সহ আইওএস 8 এ কাজ করে:

    descriptionTxt.scrollEnabled = false
    descriptionTxt.text = yourText

    var contentSize = descriptionTxt.sizeThatFits(CGSizeMake(descriptionTxt.frame.size.width, CGFloat.max))
    for c in descriptionTxt.constraints() {
        if c.isKindOfClass(NSLayoutConstraint) {
            var constraint = c as! NSLayoutConstraint
            if constraint.firstAttribute == NSLayoutAttribute.Height {
                constraint.constant = contentSize.height
                break
            }
        }
    }

1

দ্রুত উত্তর: নিম্নলিখিত কোডটি আপনার পাঠ্য ভিউয়ের উচ্চতা গণনা করে।

                let maximumLabelSize = CGSize(width: Double(textView.frame.size.width-100.0), height: DBL_MAX)
                let options = NSStringDrawingOptions.TruncatesLastVisibleLine | NSStringDrawingOptions.UsesLineFragmentOrigin
                let attribute = [NSFontAttributeName: textView.font!]
                let str = NSString(string: message)
                let labelBounds = str.boundingRectWithSize(maximumLabelSize,
                    options: NSStringDrawingOptions.UsesLineFragmentOrigin,
                    attributes: attribute,
                    context: nil)
                let myTextHeight = CGFloat(ceilf(Float(labelBounds.height)))

এখন আপনি আপনার পাঠ্য ভিউয়ের উচ্চতা এতে সেট করতে পারেন myTextHeight


দুঃখিত, এর অর্থ কী: let attribute = [NSFontAttributeName: textView.text.font!] ত্রুটি ছাড়াই এটিই কি সত্যই সুইফট কোড?) আপনি কী বোঝাতে চেয়েছিলেন let attribute = [NSFontAttributeName: textView.font!]
ম্যাসমেকার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.