ios - আমি কিভাবে তার কন্টেন্ট একটি UITextView আকার না?




cocoa-touch autolayout (20)

তার কন্টেন্ট মেনে চলতে একটি UITextView আকার UITextView করার একটি ভাল উপায় আছে? উদাহরণস্বরূপ বলুন আমার একটি UITextView যার মধ্যে পাঠ্য একটি লাইন রয়েছে:

"Hello world"

আমি তারপর টেক্সট আরেকটি লাইন যোগ করুন:

"Goodbye world"

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

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


এই আর iOS 7 বা উপরে কাজ করে না

বিষয়বস্তুটির সঠিক উচ্চতাতে UITextView আকার পরিবর্তন করার একটি খুব সহজ উপায়। এটি UITextView ব্যবহার করে সম্পন্ন করা যেতে পারে।

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

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

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

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

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

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

[self.textView sizeToFit];

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

6+ এর সাথে (5s বা 6 নয়) এটি UITextView এ "আরও একটি ফাঁকা লাইন" যোগ করে। "আরএল সমাধান" এই পুরোপুরি সমাধান করে:

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

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


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

কোন অন্য API ব্যবহার করার প্রয়োজন নেই। শুধু একটি লাইন সব সমস্যা ঠিক করা হবে।

[_textView sizeToFit];

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

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

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


আইওএস 7.0 এর জন্য, frame.size.height . frame.size.height সেটিংস frame.size.height সেট করার পরিবর্তে (যা বর্তমানে কিছু নেই) [textView sizeToFit] ব্যবহার করুন।

এই প্রশ্ন দেখুন।


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

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

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

আপনি tableViewCell গতিশীল টেক্সট textView এবং tableViewCell textView প্রয়োজন হলে উত্তর এখানে

[ https://.com/a/43137182/5360675][1] [1 https://.com/a/43137182/5360675][1]


আপনি কি [textView sizeThatFits:textView.bounds] চেষ্টা করেছেন?

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


আমার (সীমিত) অভিজ্ঞতা,

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

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

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

নতুন লাইন সম্মান করা বলে মনে হয় না।

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


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

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];

আরেকটি পদ্ধতি হল একটি নির্দিষ্ট স্ট্রিং NSString পদ্ধতি ব্যবহার করে আকার গ্রহণ করবে:

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

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

আপনি আপনার ভিউ আকার মাপ পরিবর্তন করতে তারপর ফিরে আকার ব্যবহার করতে পারেন।


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

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

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

এখানে যারা জন্য gitHub repo, যারা সব টেক্সট পড়তে না চান: resizableTextView

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

আমি মনে করি, সমস্ত সীমাবদ্ধতা-সম্পর্কিত কোড updateConstraints পদ্ধতিতে যেতে হবে। সুতরাং, এর নিজস্ব ResizableTextView

এখানে দেখা প্রথম সমস্যাটি হল viewDidLoad পদ্ধতির আগে প্রকৃত সামগ্রীর আকারটি জানেন না। আমরা দীর্ঘ এবং বাগদত্ত রাস্তা নিতে পারি এবং ফন্ট সাইজ, লাইন বিরতি ইত্যাদির ভিত্তিতে এটি গণনা করতে পারি তবে আমাদের শক্তসমর্থ সমাধান দরকার, তাই আমরা করব:

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

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

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

শেষ জিনিসটি সুপারক্লাসকে updateConstraints করতে বলা হয় 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];
}

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

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

আপনি সহজেই 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];

একটি UITextView ভিতরে একটি গতিশীলভাবে আকারের UITextView তৈরি করতে, আমি iOS 8 SDK সহ UITableViewCell 6 এ নিম্নলিখিত সমন্বয়টি খুঁজে পেয়েছি:

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

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

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

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

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


এখানে jjberberd এর দ্রুত সংস্করণ

    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

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

কোড দ্বারা

textView.scrollEnabled = false

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

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

এই ছাড়া কিছু করার প্রয়োজন নেই।


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

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

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

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


নিষ্ক্রিয় স্ক্রোলিং

constants যোগ করুন

এবং আপনার লেখা যোগ করুন

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

আপনি যদি UIScrollView ব্যবহার করেন তবে 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;
}

প্রকৃতপক্ষে সরানো এবং নীচে লাইন অবস্থান বজায় রাখার জন্য textview চান যারা জন্য

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);
}

মাইক ম্যাকমাস্টারের জবাবের সাথে মিলিত, আপনি এমন কিছু করতে চাইবেন:

[myTextView setDelegate: self];

...

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

যদি অন্য কেউ এখানে আসে, এই সমাধানটি আমার জন্য কাজ করে, 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;

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


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

                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)))

এখন আপনি আমার TextView এর myTextHeight TextHeight এ সেট করতে পারেন





uitextview