আইওটি 7-তে ইউআইটিএক্সটভিউ উচ্চতার সাথে ইউআইটিএবলভিউসেল?


121

আইওএস in-তে কোনও ইউআইটিএক্সটভিউ দিয়ে আমি কোনও ইউআইটিএবলভিউসেল এর উচ্চতা কীভাবে গণনা করতে পারি?

আমি অনুরূপ প্রশ্নের উপর অনেক উত্তর পেয়েছি, তবে sizeWithFont:প্রতিটি সমাধানে অংশ নিয়েছি এবং এই পদ্ধতিটি অবমূল্যায়ন করা হয়েছে!

আমি জানি যে আমাকে ব্যবহার করতে হবে - (CGFloat)tableView:heightForRowAtIndexPath:তবে আমি কীভাবে আমার টেক্সটভিউকে পুরো পাঠ্যটি প্রদর্শনের জন্য উচ্চতা গণনা করব?

উত্তর:


428

প্রথমত, এটি লক্ষ করা খুব গুরুত্বপূর্ণ, যে পাঠ্যটি কীভাবে রেন্ডার করা হয় তা আসে ইউআইটিেক্সটভিউ এবং ইউআইএলবেলের মধ্যে একটি বড় পার্থক্য রয়েছে is ইউআইটিেক্সটভিউয়ের সমস্ত সীমানায় কেবল ইনসেট নেই, তবে এর অভ্যন্তরের পাঠ্য বিন্যাসটিও কিছুটা আলাদা।

সুতরাং, sizeWithFont:ইউআইটিেক্সটভিউতে যাওয়ার একটি খারাপ উপায়।

পরিবর্তে UITextViewনিজেই একটি ফাংশন নামে পরিচিত sizeThatFits:যা আপনাকে UITextViewনির্দিষ্ট করতে পারে এমন একটি আবদ্ধ বাক্সের অভ্যন্তরের সমস্ত সামগ্রী প্রদর্শন করার জন্য প্রয়োজনীয় ক্ষুদ্রতম আকারটি ফিরিয়ে দেবে ।

নিম্নলিখিত আইওএস 7 এবং পুরানো সংস্করণ উভয়ের জন্য সমানভাবে কাজ করবে এবং এখনই কোনও পদ্ধতি হ'ল না, যা হ্রাস করা হয়েছে।


সরল সমাধান

- (CGFloat)textViewHeightForAttributedText: (NSAttributedString*)text andWidth: (CGFloat)width {
    UITextView *calculationView = [[UITextView alloc] init];
    [calculationView setAttributedText:text];
    CGSize size = [calculationView sizeThatFits:CGSizeMake(width, FLT_MAX)];
    return size.height;
}

এই ফাংশনটি NSAttributedStringহিসাবে একটি CGFloatএবং পছন্দসই প্রস্থ নেবে এবং প্রয়োজনীয় উচ্চতা ফিরে আসবে


বিস্তারিত সমাধান

যেহেতু আমি সম্প্রতি কিছু অনুরূপ কাজ করেছি তাই আমি ভেবেছিলাম যে আমি যে সংযুক্ত সমস্যাগুলির মুখোমুখি হয়েছি তার কিছু সমাধানও ভাগ করে নেব। আমি আশা করি এটি কারও সাহায্য করবে।

এটি গভীরতার চেয়ে অনেক বেশি এবং নিম্নলিখিতগুলি আবরণ করবে:

  • অবশ্যই: একটি UITableViewCellধারণের সম্পূর্ণ সামগ্রী প্রদর্শনের জন্য প্রয়োজনীয় আকারের উপর ভিত্তি করে একটি উচ্চতা নির্ধারণ করাUITextView
  • পাঠ্য পরিবর্তনগুলিতে সাড়া দিন (এবং সারিটির উচ্চতা পরিবর্তনগুলি অ্যানিমেট করুন)
  • কার্সারটি দৃশ্যমান অঞ্চলে রাখা এবং সম্পাদনার সময় UITextViewপুনরায় আকার দেওয়ার UITableViewCellসময় প্রথমে রেসপনার রাখা

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

১. প্রথমে উচ্চতাটি রৈঅ্যাট ইন্ডেক্সপথ: ওভাররাইট করুন

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    // check here, if it is one of the cells, that needs to be resized
    // to the size of the contained UITextView
    if (  )             
        return [self textViewHeightForRowAtIndexPath:indexPath];
    else
    // return your normal height here:
            return 100.0;           
}

2. প্রয়োজনীয় উচ্চতা গণনা করা ফাংশনটি সংজ্ঞা দিন:

আপনার NSMutableDictionary(যেমন এই উদাহরণে বলা হয় textViews) আপনার উদাহরণের পরিবর্তনশীল হিসাবে যুক্ত করুনUITableViewController সাবক্লাসে ।

পৃথকভাবে রেফারেন্স সংরক্ষণ করতে এই অভিধানটি ব্যবহার করুন UITextViews:

(এবং হ্যাঁ, সূচীপথগুলি অভিধানের জন্য কার্যকর কী )

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    
    // Do you cell configuring ...

    [textViews setObject:cell.textView forKey:indexPath];
    [cell.textView setDelegate: self]; // Needed for step 3

    return cell;
}

এই ফাংশনটি এখন আসল উচ্চতা গণনা করবে:

- (CGFloat)textViewHeightForRowAtIndexPath: (NSIndexPath*)indexPath {
    UITextView *calculationView = [textViews objectForKey: indexPath];
    CGFloat textViewWidth = calculationView.frame.size.width;
    if (!calculationView.attributedText) {
        // This will be needed on load, when the text view is not inited yet
        
        calculationView = [[UITextView alloc] init];
        calculationView.attributedText = // get the text from your datasource add attributes and insert here
        textViewWidth = 290.0; // Insert the width of your UITextViews or include calculations to set it accordingly
    }
    CGSize size = [calculationView sizeThatFits:CGSizeMake(textViewWidth, FLT_MAX)];
    return size.height;
}

৩. সম্পাদনার সময় পুনরায় আকার সক্ষম করুন

পরবর্তী দুটি ফাংশনের জন্য, এটি গুরুত্বপূর্ণ, আপনার প্রতিনিধিটি আপনার UITextViewsজন্য সেট করা আছে UITableViewController। যদি আপনার প্রতিনিধি হিসাবে অন্য কিছু প্রয়োজন হয় তবে আপনি সেখান থেকে প্রাসঙ্গিক কলগুলি করে বা উপযুক্ত এনএসএনটিফিকেশন সেন্টার হুক ব্যবহার করে এটিকে ঘিরে কাজ করতে পারেন।

- (void)textViewDidChange:(UITextView *)textView {

    [self.tableView beginUpdates]; // This will cause an animated update of
    [self.tableView endUpdates];   // the height of your UITableViewCell

    // If the UITextView is not automatically resized (e.g. through autolayout 
    // constraints), resize it here

    [self scrollToCursorForTextView:textView]; // OPTIONAL: Follow cursor
}

4. সম্পাদনা করার সময় কার্সার অনুসরণ করুন

- (void)textViewDidBeginEditing:(UITextView *)textView {
    [self scrollToCursorForTextView:textView];
}

এটি UITableViewকার্সারের অবস্থানে স্ক্রোলটি তৈরি করবে , যদি এটি ইউআইটিবেল ভিউয়ের দৃশ্যমান রেক্টের ভিতরে না থাকে:

- (void)scrollToCursorForTextView: (UITextView*)textView {
    
    CGRect cursorRect = [textView caretRectForPosition:textView.selectedTextRange.start];
    
    cursorRect = [self.tableView convertRect:cursorRect fromView:textView];
    
    if (![self rectVisible:cursorRect]) {
        cursorRect.size.height += 8; // To add some space underneath the cursor
        [self.tableView scrollRectToVisible:cursorRect animated:YES];
    }
}

5. ইনসেটগুলি সেট করে দৃশ্যমান রেকটকে সামঞ্জস্য করুন

সম্পাদনার সময়, আপনার কিছু অংশ UITableViewকীবোর্ড দ্বারা কভার করা যেতে পারে। যদি টেবিলভিউ ইনসেটগুলি সামঞ্জস্য করা scrollToCursorForTextView:না হয় তবে এটি যদি আপনার টেক্সটভিউয়ের নীচে থাকে তবে আপনার কার্সারে স্ক্রোল করতে সক্ষম হবে না।

- (void)keyboardWillShow:(NSNotification*)aNotification {
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(self.tableView.contentInset.top, 0.0, kbSize.height, 0.0);
    self.tableView.contentInset = contentInsets;
    self.tableView.scrollIndicatorInsets = contentInsets;
}

- (void)keyboardWillHide:(NSNotification*)aNotification {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.35];
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(self.tableView.contentInset.top, 0.0, 0.0, 0.0);
    self.tableView.contentInset = contentInsets;
    self.tableView.scrollIndicatorInsets = contentInsets;
    [UIView commitAnimations];
}

এবং শেষ অংশ:

আপনার ভিউ লোড হয়েছে এর ভিতরে কীবোর্ড পরিবর্তনের জন্য বিজ্ঞপ্তিগুলির জন্য সাইন আপ করুন NSNotificationCenter:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

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


হালনাগাদ:

ডেভ হাপার্ট যেমন বলেছিলেন, আমি rectVisibleফাংশনটি অন্তর্ভুক্ত করতে ভুলে গেছি :

- (BOOL)rectVisible: (CGRect)rect {
    CGRect visibleRect;
    visibleRect.origin = self.tableView.contentOffset;
    visibleRect.origin.y += self.tableView.contentInset.top;
    visibleRect.size = self.tableView.bounds.size;
    visibleRect.size.height -= self.tableView.contentInset.top + self.tableView.contentInset.bottom;
    
    return CGRectContainsRect(visibleRect, rect);
}

এছাড়াও আমি লক্ষ্য করেছি, এটি scrollToCursorForTextView:এখনও আমার প্রকল্পের পাঠ্য ফিল্ডগুলির একটিতে প্রত্যক্ষ রেফারেন্স অন্তর্ভুক্ত করেছে। আপনার যদি সন্ধান bodyTextViewনা পেয়ে সমস্যা হয় তবে ফাংশনের আপডেট হওয়া সংস্করণটি দেখুন।


1
এই কোডটি আদৌ ভাল কাজ করছে! এটি সবকিছু আকার! তবে, আমার টেক্সটভিউ সর্বদা 30px এর উচ্চতা পায়! সেটিংগুলি কি আমাকে সেট করার অনুমতি নেই, বা ইউআইটিেক্সটভিউতে আমার কিছু অনুমোদিত নয়?
MyJBMe

1
এই সমাধানটি কোনও অনুলিপি এবং পেস্টটি টেক্সট বড় হলে কোনও ধারণায় কাজ করছে বলে মনে হচ্ছে না?
ভাইকিংস

2
@ টিম বোডিট, আপনার সমাধান কাজ করে, আপনাকে ধন্যবাদ! তবে আমি মনে করি আপনার মন্তব্যে নোট করা উচিত, attributedTextফন্ট, রঙ এবং পাঠ্য প্রান্তিককরণ নির্দিষ্ট না করে নির্ধারিতকরণ পাঠ্য ভিউতে এনএসএট্রিবিউটেড স্ট্রিং বৈশিষ্ট্যের ডিফল্ট মান নির্ধারণের দিকে নিয়ে যায়। আমার ক্ষেত্রে এটি একই পাঠ্যের জন্য পাঠ্যদণ্ডের বিভিন্ন উচ্চতা লাভ করে।
আলেকজান্ডার

4
এটি আমার সর্বকালের প্রিয় স্ট্যাক ওভারফ্লো উত্তরগুলি - ধন্যবাদ!
রিচার্ড ভেনেবল

3
@ টিমবোডিট: আমি এটি iOS8 এ কাজ করতে সক্ষম নই। কীভাবে এটি ঠিক করা যেতে পারে দয়া করে আমাকে জানান।
অরুণ গুপ্ত

37

সাইজ উইথফন্টকে প্রতিস্থাপন করার জন্য একটি নতুন ফাংশন রয়েছে যা বাউন্ডারিট্যাক্ট উইথসাইজ হয়।

আমি আমার প্রকল্পে নিম্নলিখিত ফাংশনটি যুক্ত করেছি, যা আইওএস 7-তে নতুন ফাংশন এবং আইওএস-এ পুরানোটি 7. এর চেয়ে কম ব্যবহার করে এটি মূলত আকার আকারের সাথে একই বাক্য গঠন করেছে:

    -(CGSize)text:(NSString*)text sizeWithFont:(UIFont*)font constrainedToSize:(CGSize)size{
        if(IOS_NEWER_OR_EQUAL_TO_7){
            NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                              font, NSFontAttributeName,
                                              nil];

            CGRect frame = [text boundingRectWithSize:size
                                              options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
                                           attributes:attributesDictionary
                                              context:nil];

            return frame.size;
        }else{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
            return [text sizeWithFont:font constrainedToSize:size];
#pragma clang diagnostic pop
        }
    }

আপনি আপনার প্রকল্পে আপনার উপসর্গ.pch ফাইল এ IOS_NEWER_OR_EQUAL_TO_7 যুক্ত করতে পারেন:

#define IOS_NEWER_OR_EQUAL_TO_7 ( [ [ [ UIDevice currentDevice ] systemVersion ] floatValue ] >= 7.0 )

আমার ইউআইটিেক্সটভিউগুলি এখনও খুব ভাল স্কেল করে না এবং যখন পাঠ্যটি 3 লাইন বিস্তৃত হয় তখন স্ক্রোলযোগ্য হয়; পেস্টবিন.
com/ডাব্লুএইচ

দ্বিতীয় রিটার্নের বিবৃতিটি এক্সকোডে অবমূল্যায়ন সতর্কতা নিক্ষেপ করে।
মার্টিন ডি কেইজেজার

আপনি কি সেলফোরআউটইন্ডেক্সপ্যাথে, পাঠ্যটির গণনা করা মাপের জন্য ইউআইটেক্সটভিউয়ের আকারটি সেট করছেন? এছাড়াও দ্বিতীয় রিটার্নে আপনাকে সতর্কবার্তাটি নিয়ে চিন্তা করা উচিত নয় কারণ অ্যাপটি কোনও iOS6 ডিভাইসে চালিত হয় যেখানে ফাংশনটি হ্রাস না করা হয় only
manecosta

আপনি কীভাবে এই ফাংশনটি ব্যবহার করবেন তার একটি সাধারণ উদাহরণ সরবরাহ করতে পারেন?
জোড়ায়র

@ মানেকোস্টা অ্যাপলের ডকুমেন্টেশন বলছে যে আপনাকে অবশ্যই ফলাফলটি 'সিল' করতে হবে: আইওএস 7 এবং তারপরে, এই পদ্ধতিটি ভগ্নাংশের আকারগুলি (প্রত্যাবর্তিত সিজিআরেক্টের আকারের উপাদানগুলিতে) প্রদান করে; আকারের আকারে কোনও প্রত্যাবর্তিত আকার ব্যবহার করতে, আপনাকে অবশ্যই সিল ফাংশনটি ব্যবহার করে নিকটতম উচ্চতর পূর্ণসংখ্যার কাছে এর মান বাড়াতে হবে।
এইচপিটাইম

9

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

আমার কাছে পাঠ্য দর্শনটির উচ্চতার জন্য একটি সীমাবদ্ধতা রয়েছে এবং আমি নিম্নলিখিত পদ্ধতিগুলি এর মতো প্রয়োগ করেছি:

// Outlets

@property (weak, nonatomic) IBOutlet UITextView *textView;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *textViewHeight;


// Implementation

#pragma mark - Private Methods

- (void)updateTextViewHeight {
    self.textViewHeight.constant = self.textView.contentSize.height + self.textView.contentInset.top + self.textView.contentInset.bottom;
}

#pragma mark - View Controller Overrides

- (void)viewDidLoad {
    [super viewDidLoad];
    [self updateTextViewHeight];
}

#pragma mark - TableView Delegate & Datasource

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 80;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return UITableViewAutomaticDimension;
}

#pragma mark - TextViewDelegate

- (void)textViewDidChange:(UITextView *)textView {
    [self.tableView beginUpdates];
    [self updateTextViewHeight];
    [self.tableView endUpdates];
}

তবে মনে রাখবেন : পাঠ্য দর্শনটি অবশ্যই স্ক্রোলযোগ্য হবে এবং আপনার নিজের সীমাবদ্ধতাগুলি সেটআপ করতে হবে যাতে তারা স্বয়ংক্রিয় মাত্রার জন্য কাজ করে:

  • একে অপরের সাথে সম্পর্কিত সেলগুলিতে সমস্ত দৃশ্যের সেট আপ করুন স্থির উচ্চতা সহ (পাঠ্য দেখার উচ্চতা সহ যা আপনি অগ্রগতিতে পরিবর্তন করবেন)
  • উপরের সর্বাধিক দর্শনে শীর্ষের স্পেসিং রয়েছে এবং নীচের বেশিরভাগ দৃশ্যে সুপার ভিউতে নীচের ব্যবধান রয়েছে;

সর্বাধিক বুনিয়াদি সেল উদাহরণ:

  • পাঠ্যদর্শন ব্যতীত কক্ষে অন্য কোনও মতামত নেই
  • পাঠ্য দর্শনের চারপাশে 0 মার্জিন এবং পাঠ্য দর্শনের জন্য পূর্বনির্ধারিত উচ্চতার সীমাবদ্ধতা।

1
পাঠ্য দর্শনটি অবশ্যই স্ক্রোলযোগ্য নয়
অক্ষিত জাভেরি

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

5

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

আইওএস and এবং এর নীচে সমস্ত কিছুই কাজ করছে তবে আইওএস in-এ পাঠ্য প্রদর্শনের frameপাঠ্যটি সত্যই পুনরায় আকার দেওয়া সত্ত্বেও পাঠ্য দৃশ্যে পাঠ্যটি সম্পূর্ণরূপে প্রদর্শিত হতে পারে না । (আমি ব্যবহার করছি না Auto Layout)। এটা তোলে কারণ আইওএস 7 এ আছে যে হওয়া উচিত TextKitএবং টেক্সট অবস্থান দ্বারা নিয়ন্ত্রিত হয় NSTextContainerমধ্যে UITextView। সুতরাং আমার ক্ষেত্রে someTextViewএটি আইওএস 7 এ সঠিকভাবে কাজ করার জন্য আমার একটি লাইন যুক্ত করতে হবে।

    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
        someTextView.textContainer.heightTracksTextView = YES;
    }

ডকুমেন্টেশন যেমন বলেছিল, সেই সম্পত্তি যা করে তা হ'ল:

গ্রাহকটির পাঠ্য দৃশ্যের পুনরায় আকার দেওয়া হলে প্রাপকটি তার সীমানার আয়তক্ষেত্রের উচ্চতা সামঞ্জস্য করে কিনা তা নিয়ন্ত্রণ করে। ডিফল্ট মান: না।

ডিফল্ট মান সঙ্গে করার জন্য এটিকে ছাড়তে পর মাপ পরিবর্তন যদি frameএর someTextView, আকার textContainer, ফলে শুধুমাত্র পাঠ্য মাপ আগে এলাকায় প্রদর্শিত হতে পারে নেতৃস্থানীয় পরিবর্তন করা হয়।

এবং সম্ভবত এটির scrollEnabled = NOএকটির textContainerবেশিের ক্ষেত্রে সেটটি স্থাপন করা প্রয়োজন , যাতে পাঠ্যটি textContainerএকে অপরের থেকে অন্যটিতে চলে আসে।


4

এখানে আরও একটি সমাধান দেওয়া হয়েছে যার লক্ষ্য সরলতা এবং দ্রুত প্রোটোটাইপিং :

সেটআপ:

  1. প্রোটোটাইপ কোষ সহ টেবিল।
  2. প্রতিটি ঘরে গতিশীল আকারের থাকে UITextView ডাব্লু / অন্যান্য সামগ্রী থাকে।
  3. প্রোটোটাইপ কোষগুলির সাথে সম্পর্কিত TableCell.h
  4. UITableViewসঙ্গে যুক্ত করা হয় TableViewController.h

সমাধান:

(1) এতে যুক্ত করুন TableViewController.m:

 // This is the method that determines the height of each cell.  
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    // I am using a helper method here to get the text at a given cell.
    NSString *text = [self getTextAtIndex:indexPath];

    // Getting the height needed by the dynamic text view.
    CGSize size = [self frameForText:text sizeWithFont:nil constrainedToSize:CGSizeMake(300.f, CGFLOAT_MAX)];

    // Return the size of the current row.
    // 80 is the minimum height! Update accordingly - or else, cells are going to be too thin.
    return size.height + 80; 
}

// Think of this as some utility function that given text, calculates how much 
// space would be needed to fit that text.
- (CGSize)frameForText:(NSString *)text sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size
{
    NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                          font, NSFontAttributeName,
                                          nil];
    CGRect frame = [text boundingRectWithSize:size
                                      options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
                                   attributes:attributesDictionary
                                      context:nil];

    // This contains both height and width, but we really care about height.
    return frame.size;
}

// Think of this as a source for the text to be rendered in the text view. 
// I used a dictionary to map indexPath to some dynamically fetched text.
- (NSString *) getTextAtIndex: (NSIndexPath *) indexPath
{
    return @"This is stubbed text - update it to return the text of the text view.";
}

(২) এতে যুক্ত করুন TableCell.m:

// This method will be called when the cell is initialized from the storyboard
// prototype. 
- (void)awakeFromNib
{
    // Assuming TextView here is the text view in the cell. 
    TextView.scrollEnabled = YES;
}

ব্যাখ্যা:

সুতরাং এখানে যা ঘটছে তা হ'ল: প্রতিটি পাঠ্য দর্শনটি উল্লম্ব এবং অনুভূমিক সীমাবদ্ধতার দ্বারা টেবিল কক্ষগুলির উচ্চতার সাথে আবদ্ধ - যার অর্থ যখন টেবিল ঘরের উচ্চতা বৃদ্ধি পায়, তখন পাঠ্য দর্শনটি তার আকারও বৃদ্ধি করে। আমি একটি ঘরটিতে প্রদত্ত পাঠ্যকে ফিট করার জন্য একটি পাঠ্য দৃশ্যের প্রয়োজনীয় উচ্চতা গণনা করতে @ ম্যানকোস্তার কোডের একটি পরিবর্তিত সংস্করণ ব্যবহার করেছি। সুতরাং এর মানে হল যে অক্ষরের সংখ্যার সাথে একটি পাঠ্য দেওয়া হয়েছে, frameForText:এমন একটি আকার ফিরে আসবে যার একটি সম্পত্তি থাকবেsize.height পাঠ্য দর্শনের প্রয়োজনীয় উচ্চতার সাথে মেলে।

এখন, বাকি সমস্তগুলি হ'ল প্রয়োজনীয় পাঠ্য দর্শনটির উচ্চতার সাথে মেলে সেচের উচ্চতা আপডেট করা। এবং এটি এ অর্জন করা হয় heightForRowAtIndexPath:। মন্তব্যে উল্লিখিত হিসাবে, যেহেতু size.heightশুধুমাত্র পাঠ্য দেখার জন্য উচ্চতা এবং পুরো ঘরটি নয়, তাই এতে কিছু অফসেট যুক্ত হওয়া উচিত। উদাহরণের ক্ষেত্রে, এই মানটি 80 ছিল।


এই 'স্বপ্ন.ড্রিম' বলতে কী বোঝায়?
মাইজেবিএম

@ আমার জেবি আমাকে দুঃখিত যে এটি আমার নিজের প্রকল্পের অংশ ছিল - আমি সেই অনুযায়ী কোডটি আপডেট করেছি। dream.dreamআমি পাঠ্য দৃশ্যে যে পাঠ্যটি রেন্ডার করছিলাম তা ছিল।
জোড়ায়ার

3

আপনি যদি অটোলেআউট ব্যবহার করছেন তবে একটি উপায় হ'ল অটোলেআউট ইঞ্জিনটি আপনার জন্য আকার গণনা করা। এটি সর্বাধিক দক্ষ পদ্ধতি নয় তবে এটি বেশ সুবিধাজনক (এবং যুক্তিযুক্তভাবে সবচেয়ে নির্ভুল)। ঘর বিন্যাসের জটিলতা বাড়ার সাথে সাথে এটি আরও সুবিধাজনক হয়ে ওঠে - যেমন হঠাৎ আপনার ঘরে দুটি বা ততোধিক পাঠ্যদর্শন / ক্ষেত্র রয়েছে।

অটো লেআউটটি ব্যবহার করে টেবিলভিউ সেলগুলি আকার দেওয়ার জন্য সম্পূর্ণ নমুনা সহ আমি একই ধরণের প্রশ্নের উত্তর দিয়েছি:

অটোলেআউট দিয়ে সমস্ত উপদর্শন ফিট করার জন্য সুপারভিউকে কীভাবে পুনরায় আকার দিন?


1

সম্পূর্ণ মসৃণ সমাধানটি নিম্নরূপ।

প্রথমত, আমাদের পাঠ্য ভিউ সহ ঘর শ্রেণি প্রয়োজন

@protocol TextInputTableViewCellDelegate <NSObject>
@optional
- (void)textInputTableViewCellTextWillChange:(TextInputTableViewCell *)cell;
- (void)textInputTableViewCellTextDidChange:(TextInputTableViewCell *)cell;
@end

@interface TextInputTableViewCell : UITableViewCell
@property (nonatomic, weak) id<TextInputTableViewCellDelegate> delegate;
@property (nonatomic, readonly) UITextView *textView;
@property (nonatomic) NSInteger minLines;
@property (nonatomic) CGFloat lastRelativeFrameOriginY;
@end


#import "TextInputTableViewCell.h"

@interface TextInputTableViewCell () <UITextViewDelegate> {
    NSLayoutConstraint *_heightConstraint;
}
@property (nonatomic) UITextView *textView;
@end

@implementation TextInputTableViewCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        self.selectionStyle = UITableViewCellSelectionStyleNone;

        _textView = [UITextView new];
        _textView.translatesAutoresizingMaskIntoConstraints = NO;
        _textView.delegate = self;
        _textView.scrollEnabled = NO;
        _textView.font = CELL_REG_FONT;
        _textView.textContainer.lineFragmentPadding = 0.0;
        _textView.textContainerInset = UIEdgeInsetsZero;
        [self.contentView addSubview:_textView];

        [self.contentView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[view]-|" options:nil metrics:nil views:@{@"view": _textView}]];
        [self.contentView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[view]-|" options:nil metrics:nil views:@{@"view": _textView}]];

        _heightConstraint = [NSLayoutConstraint constraintWithItem: _textView
                         attribute: NSLayoutAttributeHeight
                         relatedBy: NSLayoutRelationGreaterThanOrEqual
                         toItem: nil
                         attribute: NSLayoutAttributeNotAnAttribute
                         multiplier: 0.0
                         constant: (_textView.font.lineHeight + 15)];
        _heightConstraint.priority = UILayoutPriorityRequired - 1;
        [_textView addConstraint:_heightConstraint];
    }
    return self;
}

- (void)prepareForReuse {
    [super prepareForReuse];    
    self.minLines = 1;
}

- (void)setMinLines:(NSInteger)minLines {
    _heightConstraint.constant = minLines * _textView.font.lineHeight + 15;
}

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if ([self.delegate respondsToSelector:@selector(textInputTableViewCellTextWillChange:)]) {
        [self.delegate textInputTableViewCellTextWillChange:self];
    }
    return YES;
}

- (void)textViewDidChange:(UITextView *)textView {
    if ([self.delegate respondsToSelector:@selector(textInputTableViewCellTextDidChange:)]) {
        [self.delegate textInputTableViewCellTextDidChange:self];
    }
}

এরপরে, আমরা এটি টেবিলভিউ নিয়ন্ত্রণকারীতে ব্যবহার করি

@interface SomeTableViewController () <TextInputTableViewCellDelegate>
@end

@implementation SomeTableViewController

. . . . . . . . . . . . . . . . . . . .

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    TextInputTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: TextInputTableViewCellIdentifier forIndexPath:indexPath];
    cell.delegate = self;
    cell.minLines = 3;
    . . . . . . . . . .  
    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return UITableViewAutomaticDimension;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return UITableViewAutomaticDimension;
}

- (void)textInputTableViewCellWillChange:(TextInputTableViewCell *)cell {
    cell.lastRelativeFrameOriginY = cell.frame.origin.y - self.tableView.contentOffset.y;
}

- (void)textInputTableViewCellTextDidChange:(TextInputTableViewCell *)cell {
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

    [UIView performWithoutAnimation:^{
        [self.tableView moveRowAtIndexPath:indexPath toIndexPath:indexPath];
    }];

    CGFloat contentOffsetY = cell.frame.origin.y - cell.lastRelativeFrameOriginY;
    self.tableView.contentOffset = CGPointMake(self.tableView.contentOffset.x, contentOffsetY);

    CGRect caretRect = [cell.textView caretRectForPosition:cell.textView.selectedTextRange.start];
    caretRect = [self.tableView convertRect:caretRect fromView:cell.textView];

    CGRect visibleRect = self.tableView.bounds;
    visibleRect.origin.y += self.tableView.contentInset.top;
    visibleRect.size.height -= self.tableView.contentInset.top + self.tableView.contentInset.bottom;
    BOOL res = CGRectContainsRect(visibleRect, caretRect);
    if (!res) {
        caretRect.size.height += 5;
        [self.tableView scrollRectToVisible:caretRect animated:NO];
    }
}
@end
  • এখানে minLinesটেক্সটভিউয়ের জন্য সর্বনিম্ন উচ্চতা নির্ধারণ করতে অনুমতি দেওয়া হয়েছে (ইউআইটিবেল ভিউআউটোমেটিক ডাইমেনশন সহ অটলয়আউট দ্বারা উচ্চতা হ্রাসকে প্রতিরোধ করতে)।

  • moveRowAtIndexPath:indexPath: একই সূচকপথের সাহায্যে টেবিলভিউসেল উচ্চতার পুনরায় গণনা এবং পুনরায় বিন্যাস শুরু হয়।

  • performWithoutAnimation: পার্শ্ব-প্রভাব সরিয়ে দেয় (টাইপ করার সময় নতুন লাইন শুরু করার সময় টেবিলভিউ সামগ্রীটি অফসেট জাম্পিং)।

  • সেল আপডেটের সময় সেল relativeFrameOriginY( contentOffsetYআপডেট!) সংরক্ষণ করা গুরুত্বপূর্ণ কারণ contentSizeবর্তমান কক্ষটি অপ্রত্যাশিত উপায়ে স্বয়ংক্রিয়ভাবে ক্যালকুলাসের মাধ্যমে পরিবর্তিত হতে পারে the এটি দীর্ঘ শব্দ টাইপ করার সময় সিস্টেম হাইফেনেশনে ভিজ্যুয়াল জাম্পগুলি সরিয়ে দেয়।

  • মনে রাখবেন আপনার সম্পত্তি সেট করা উচিত নয় estimatedRowHeight ! নিম্নলিখিত কাজ করে না

    self.tableView.estimatedRowHeight = UITableViewAutomaticDimension;

    কেবল টেবিলভিউডেলিগেট পদ্ধতি ব্যবহার করুন।

================================================== ========================

যদি কেউ টেবিলভিউ এবং টেবিলভিউসেল এবং টেবিলভিউর জেলিটিকে টেবিলভিউসেল থেকে জ্যামিতি আপডেট করার মধ্যে দুর্বল বাঁধার বিরুদ্ধে আপত্তি না দেখায় তবে উপরের শ্রেণিটি আপগ্রেড করা সম্ভব TextInputTableViewCell:

@interface TextInputTableViewCell : UITableViewCell
@property (nonatomic, weak) id<TextInputTableViewCellDelegate> delegate;
@property (nonatomic, weak) UITableView *tableView;
@property (nonatomic, readonly) UITextView *textView;
@property (nonatomic) NSInteger minLines;
@end


#import "TextInputTableViewCell.h"

@interface TextInputTableViewCell () <UITextViewDelegate> {
    NSLayoutConstraint *_heightConstraint;
    CGFloat _lastRelativeFrameOriginY;
}
@property (nonatomic) UITextView *textView;
@end

@implementation TextInputTableViewCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        self.selectionStyle = UITableViewCellSelectionStyleNone;

        _textView = [UITextView new];
        _textView.translatesAutoresizingMaskIntoConstraints = NO;
        _textView.delegate = self;
        _textView.scrollEnabled = NO;
        _textView.font = CELL_REG_FONT;
        _textView.textContainer.lineFragmentPadding = 0.0;
        _textView.textContainerInset = UIEdgeInsetsZero;
        [self.contentView addSubview:_textView];

        [self.contentView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[view]-|" options:nil metrics:nil views:@{@"view": _textView}]];
        [self.contentView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[view]-|" options:nil metrics:nil views:@{@"view": _textView}]];

        _heightConstraint = [NSLayoutConstraint constraintWithItem: _textView
                         attribute: NSLayoutAttributeHeight
                         relatedBy: NSLayoutRelationGreaterThanOrEqual
                         toItem: nil
                         attribute: NSLayoutAttributeNotAnAttribute
                         multiplier: 0.0
                         constant: (_textView.font.lineHeight + 15)];
        _heightConstraint.priority = UILayoutPriorityRequired - 1;
        [_textView addConstraint:_heightConstraint];
    }
    return self;
}

- (void)prepareForReuse {
    [super prepareForReuse];    
    self.minLines = 1;
    self.tableView = nil;
}

- (void)setMinLines:(NSInteger)minLines {
    _heightConstraint.constant = minLines * _textView.font.lineHeight + 15;
}

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {

    _lastRelativeFrameOriginY = self.frame.origin.y - self.tableView.contentOffset.y;
    return YES;
}

- (void)textViewDidChange:(UITextView *)textView {

    NSIndexPath *indexPath = [self.tableView indexPathForCell:self];
    if (indexPath == nil) return;

    [UIView performWithoutAnimation:^{
        [self.tableView moveRowAtIndexPath:indexPath toIndexPath:indexPath];
    }];

    CGFloat contentOffsetY = self.frame.origin.y - _lastRelativeFrameOriginY;
    self.tableView.contentOffset = CGPointMake(self.tableView.contentOffset.x, contentOffsetY);

    CGRect caretRect = [self.textView caretRectForPosition:self.textView.selectedTextRange.start];
    caretRect = [self.tableView convertRect:caretRect fromView:self.textView];

    CGRect visibleRect = self.tableView.bounds;
    visibleRect.origin.y += self.tableView.contentInset.top;
    visibleRect.size.height -= self.tableView.contentInset.top + self.tableView.contentInset.bottom;

    BOOL res = CGRectContainsRect(visibleRect, caretRect);
    if (!res) {
        caretRect.size.height += 5;
        [self.tableView scrollRectToVisible:caretRect animated:NO];
    }
}
@end

1
  1. আপনার ইউআইটিেক্সটভিউয়ের পিছনে ইউআইএলবেল রাখুন।
  2. এই উত্তরটি ব্যবহার করুন: https://stackoverflow.com/a/36054679/6681462 আপনার তৈরি UILabel- এ
  3. তাদের একই বাধা এবং হরফ দিন
  4. তাদের একই পাঠ্য সেট করুন;

আপনার ঘরের উচ্চতা ইউআইএলবেলের সামগ্রী দ্বারা গণনা করা হবে তবে সমস্ত পাঠ্য পাঠ্যফিল্ড দ্বারা প্রদর্শিত হবে।


0
UITextView *txtDescLandscape=[[UITextView alloc] initWithFrame:CGRectMake(2,20,310,2)];

    txtDescLandscape.editable =NO;
    txtDescLandscape.textAlignment =UITextAlignmentLeft;
    [txtDescLandscape setFont:[UIFont fontWithName:@"ArialMT" size:15]];
    txtDescLandscape.text =[objImage valueForKey:@"imgdescription"];
    txtDescLandscape.text =[txtDescLandscape.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    [txtDescLandscape sizeToFit];
    [headerView addSubview:txtDescLandscape];

    CGRect txtViewlandscpframe = txtDescLandscape.frame;
    txtViewlandscpframe.size.height = txtDescLandscape.contentSize.height;
    txtDescLandscape.frame = txtViewlandscpframe;

আমি মনে করি এইভাবে আপনি আপনার পাঠ্য দর্শনটির উচ্চতা গণনা করতে পারেন এবং তারপরে সেই উচ্চতা অনুযায়ী আপনার টেবিলভিউ সেলটি আকার পরিবর্তন করতে পারেন যাতে আপনি ঘরে পুরো পাঠ্যটি প্রদর্শন করতে পারেন


0

সুইফট সংস্করণ

func textViewHeightForAttributedText(text: NSAttributedString, andWidth width: CGFloat) -> CGFloat {
    let calculationView = UITextView()
    calculationView.attributedText = text
    let size = calculationView.sizeThatFits(CGSize(width: width, height: CGFloat.max))
    return size.height
}

0

আপনি যদি UITableViewCellঅভ্যন্তরের উচ্চতার উচ্চতার উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে এর উচ্চতা সামঞ্জস্য করতে চান UITextView। আমার উত্তরটি এখানে দেখুন: https://stackoverflow.com/a/45890087/1245231

সমাধানটি বেশ সহজ এবং আইওএস since সাল থেকে কাজ করা উচিত Make স্টোরি বোর্ডের অভ্যন্তরের জন্য Scrolling Enabledবিকল্পটি বন্ধ করা UITextViewআছে UITableViewCellতা নিশ্চিত করুন।

তারপরে আপনার ইউআইটিএবলভিউ কনট্রোলারের ভিউডিডলড () সেট করুন tableView.rowHeight = UITableViewAutomaticDimensionএবং tableView.estimatedRowHeight > 0যেমন:

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.rowHeight = UITableViewAutomaticDimension
    tableView.estimatedRowHeight = 44.0
}

এটাই. UITableViewCellঅভ্যন্তরের UITextViewউচ্চতার উপর নির্ভর করে এর উচ্চতা স্বয়ংক্রিয়ভাবে সামঞ্জস্য হবে ।


-2

আইওএস 8 এবং এর উপরে আপনি কেবল ব্যবহার করতে পারবেন use

your_tablview.estimatedrowheight= minheight তুমি চাও

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