আমি কাস্টম সেল ব্যতীত কোনও ইউআইটিএবলভিউসেলটিতে কীভাবে পাঠ্যগুলি মোড়াতে পারি


151

এটি আইফোন 0 এস 2.0 এ রয়েছে। ২.১ এর উত্তরগুলিও ঠিক আছে, যদিও আমি সারণী সংক্রান্ত কোনও পার্থক্য সম্পর্কে অবগত নই।

এটি একটি কাস্টম সেল তৈরি না করে মোড়ানোর জন্য পাঠ্য পাওয়া সম্ভব হবে বলে মনে হয়, যেহেতু UITableViewCellএতে একটি UILabelডিফল্ট থাকে। আমি জানি আমি যদি কাস্টম সেল তৈরি করি তবে এটি কাজ করতে পারি, তবে এটি আমি অর্জন করার চেষ্টা করছি না - আমার বর্তমান পদ্ধতির কাজ কেন হয় না তা বুঝতে চাই।

আমি বুঝতে পেরেছি যে চাহিদা অনুযায়ী লেবেলটি তৈরি করা হয়েছে (যেহেতু ঘর পাঠ্য এবং চিত্রের অ্যাক্সেসকে সমর্থন করে, তাই এটি প্রয়োজনীয় না হওয়া পর্যন্ত ডেটা ভিউ তৈরি করে না), তাই যদি আমি এই জাতীয় কিছু করি:

cell.text = @""; // create the label
UILabel* label = (UILabel*)[[cell.contentView subviews] objectAtIndex:0];

তারপরে আমি একটি বৈধ লেবেল পাই, তবে numberOfLinesএটির (এবং লাইনব্রাকমোড) সেট করা কাজ করে না - আমি এখনও একক লাইনের পাঠ্য পাই। UILabelপাঠ্যটি প্রদর্শনের জন্য প্রচুর উচ্চতা রয়েছে - আমি কেবলমাত্র উচ্চতার জন্য একটি বড় মান ফিরিয়ে দিচ্ছি heightForRowAtIndexPath

উত্তর:


277

এখানে একটি সহজ উপায়, এবং এটি আমার পক্ষে কাজ করে:

আপনার cellForRowAtIndexPath:ফাংশন ভিতরে । আপনি প্রথমবার নিজের ঘরটি তৈরি করবেন:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
}

আপনি লক্ষ্য করবেন যে আমি লেবেলের জন্য লাইনগুলির সংখ্যা 0 তে সেট করেছি This এটি এটি যতটা লাইন প্রয়োজন তেমন ব্যবহার করতে দেয়।

পরের অংশটি আপনার কত বড় UITableViewCellহবে তা নির্দিষ্ট করে দেওয়া উচিত, তাই আপনার heightForRowAtIndexPathফাংশনে এটি করুন:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellText = @"Go get some text for your cell.";
    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
    CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

    return labelSize.height + 20;
}

আমি আমার ফিরে আসা ঘরের উচ্চতায় 20 টি যুক্ত করেছি কারণ আমি আমার পাঠ্যের চারপাশে একটু বাফার পছন্দ করি।


17
আপনার সেল.টেক্সটলবেল.নম্বার অফলাইনগুলি কিছু নির্বিচারে উচ্চ সংখ্যায় সেট করার দরকার নেই। এটিকে 0-এ সেট করার অর্থ "যতগুলি লাইন এটি প্রদর্শিত হতে পারে" means
এমএমসি

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


1
ক্যাগরিন: দেখা যাচ্ছে আমি এটির অনুলিপি করতে পারি, তবে কেবল যদি আমি সিমুলেটারে আইফোন ওএস 3.0 ব্যবহার করি। আমি যখন ৩.১++ ব্যবহার করি, তখন বিশদ পাঠ্য লেবেলের আকার পরিবর্তন করে আকারের সাথে মিলিয়ে ফন্টফন্টটি ঠিক ঠিক থাকে। সুতরাং টিমের পদ্ধতিটি সত্যিই দুর্দান্তভাবে কাজ করে - কেবল ৩.১++ এর জন্য (সম্ভবত 3.0 ডিফল্ট সেল উপস্থাপনায় কোনও বাগ / অপব্যবহারের কারণে)। রেকর্ডের জন্য, আমি 12 (প্রতিটি) এর উল্লম্ব শীর্ষ / নীচের মার্জিন, (188.0, সিজিএফএলএএফএএমএএমএক্স) এর একটি বিশিষ্ট পাঠ্য লেবেল আকার এবং একটি বোল্ডসিসটেমফন্টআফসাইজ 15 ব্যবহার করছি
জো

17
UILineBreakModeWordWrap আইওএস-এ ছিন্ন করা হয়েছে 6 পরিবর্তে NSLineBreakByWordWrapping ব্যবহার করুন।
এথান অ্যালেন

16

আইওএস 7 এর জন্য টিম রুপের উত্তর আপডেট হয়েছে:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ;
    cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellText = @"Go get some text for your cell.";
    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];

    NSAttributedString *attributedText =
        [[NSAttributedString alloc]
            initWithString:cellText
            attributes:@
            {
                NSFontAttributeName: cellFont
            }];
    CGRect rect = [attributedText boundingRectWithSize:CGSizeMake(tableView.bounds.size.width, CGFLOAT_MAX)
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                               context:nil];
    return rect.size.height + 20;
}

3

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

পাঠ্য মোড়ানো না থাকায় এনআইবি ফাইলের ভিতরে আমার সেটিংস ছিল এবং লেবেলের জন্য কেবল 1 লাইন রয়েছে; এনআইবি ফাইল সেটিংস কোডের অভ্যন্তরে আমি যে পরিমাণ সেটিংস সামঞ্জস্য করেছি সেগুলি ওভাররাইড করে।

আমি যে পাঠ নিয়েছি তা হ'ল সময়কালে প্রতিটি পয়েন্টে অবজেক্টগুলির অবস্থা কী তা সর্বদা মনে রাখা উচিত - সেগুলি এখনও তৈরি করা হয়নি! ... এই লাইনে কাউকে।


2

যদি আমরা UITableViewঘরে কেবল পাঠ্য যুক্ত করতে চাই তবে আমাদের সাথে কাজ করার জন্য কেবল দুটি প্রতিনিধি প্রয়োজন (অতিরিক্ত যুক্ত করার প্রয়োজন নেই UILabels)

1) cellForRowAtIndexPath

2) heightForRowAtIndexPath

এই সমাধানটি আমার পক্ষে কাজ করেছে: -

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{ 
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:16];
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;

    [cell setSelectionStyle:UITableViewCellSelectionStyleGray]; 
    cell.textLabel.text = [mutArr objectAtIndex:indexPath.section];
    NSLog(@"%@",cell.textLabel.text);

    cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrow.png" ]];

    return cell;

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{  
    CGSize labelSize = CGSizeMake(200.0, 20.0);

    NSString *strTemp = [mutArr objectAtIndex:indexPath.section];

    if ([strTemp length] > 0)
        labelSize = [strTemp sizeWithFont: [UIFont boldSystemFontOfSize: 14.0] constrainedToSize: CGSizeMake(labelSize.width, 1000) lineBreakMode: UILineBreakModeWordWrap];

    return (labelSize.height + 10);
}

এখানে স্ট্রিংটি mutArrএকটি পরিবর্তনীয় অ্যারে যা থেকে আমি আমার ডেটা পাচ্ছি।

সম্পাদনা: - আমি যে অ্যারেটি নিয়েছি তা এখানে।

mutArr= [[NSMutableArray alloc] init];

[mutArr addObject:@"HEMAN"];
[mutArr addObject:@"SUPERMAN"];
[mutArr addObject:@"Is SUPERMAN powerful than HEMAN"];
[mutArr addObject:@"Well, if HEMAN is weaker than SUPERMAN, both are friends and we will never get to know who is more powerful than whom because they will never have a fight among them"];
[mutArr addObject:@"Where are BATMAN and SPIDERMAN"];

2

এখন টেবিলভিউতে স্ব-আকার দেওয়ার কক্ষ থাকতে পারে। নীচে টেবিল ভিউ সেট আপ করুন

tableView.estimatedRowHeight = 85.0 //use an appropriate estimate tableView.rowHeight = UITableViewAutomaticDimension

অ্যাপল রেফারেন্স


0

আমি নিম্নলিখিত সমাধানগুলি ব্যবহার করি।

ডেটা আলাদাভাবে কোনও সদস্যের মধ্যে সরবরাহ করা হয়:

-(NSString *)getHeaderData:(int)theSection {
    ...
    return rowText;
}

হ্যান্ডলিংটি সহজেই করা যায় cellForRowAtIndexPath। ঘরটি সংজ্ঞায়িত করুন / ফন্টটি সংজ্ঞায়িত করুন এবং ফলাফলটি "সেল" এ এই মানগুলি নির্ধারণ করুন। নোট করুন যে numberoflines"0" তে সেট করা হয়েছে, যার অর্থ যা প্রয়োজন তা গ্রহণ করুন।

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

    UIFont *cellFont = [UIFont fontWithName:@"Verdana" size:12.0];
    cell.textLabel.text= [self getRowData:indexPath.section];
    cell.textLabel.font = cellFont;
    cell.textLabel.numberOfLines=0;
    return cell;
}

ইন heightForRowAtIndexPath, আমি মোড়ানো পাঠ্যের উচ্চতা গণনা করি। বোডিংয়ের আকারটি আপনার কক্ষের প্রস্থের সাথে সম্পর্কিত। আইপ্যাডের জন্য এটি 1024 হবে iPhone আইফোনের জন্য আইপড 320।

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIFont *cellFont = [UIFont fontWithName:@"Verdana" size:12.0];
    CGSize boundingSize = CGSizeMake(1024, CGFLOAT_MAX);
    CGSize requiredSize = [[self getRowData:indexPath.section] sizeWithFont:cellFont constrainedToSize:boundingSize lineBreakMode:UILineBreakModeWordWrap];
    return requiredSize.height;    
}

0

আমি এটি বেশ সহজ এবং সোজা ফরওয়ার্ড বলে মনে করেছি:

[self.tableView setRowHeight:whatEvereight.0f];

যেমন:

[self.tableView setRowHeight:80.0f];

এটি করার জন্য এটি সর্বোত্তম / মানক পদ্ধতির হতে পারে বা নাও হতে পারে তবে এটি আমার ক্ষেত্রে কার্যকর হয়েছে।


আমি এটি বুঝতে পেরে, সারিউইট সম্পত্তিটি একটি নির্দিষ্ট উচ্চতা নির্ধারণ করে যা সারণী দর্শনতে সমস্ত কক্ষের জন্য ব্যবহৃত হবে। বড় টেবিলগুলিতে পারফরম্যান্সের জন্য সারিহাইটটি ব্যবহার করা আরও ভাল তবে যদি প্রতিটি কক্ষের সামগ্রীর উপর ভিত্তি করে আলাদা আলাদা আলাদা উচ্চতা প্রয়োজন হয় তবে এটি টেবিল ভিউ: উচ্চতাফরআউটএন্টেক্সপথ: পদ্ধতিটি ব্যবহার করতে হবে।
jk7

0

দ্রুত আমার কোড চেষ্টা করুন। এই কোডটি সাধারণ ইউআইএলবেলগুলির জন্যও কাজ করবে।

extension UILabel {
    func lblFunction() {
        //You can pass here all UILabel properties like Font, colour etc....
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want word wraping
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

এখন সহজভাবে কল করুন

cell.textLabel.lblFunction()//Replace your label name 

-1

আমি মনে করি এটি একটি আরও ভাল এবং খাটো সমাধান। নির্দিষ্ট করে উচ্চতার জন্য অটো গণনা করতে সেলটির UILabel( textLabel) বিন্যাস করুন sizeToFitএবং সবকিছু ঠিকঠাক হওয়া উচিত।

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...
    cell.textLabel.text = @"Whatever text you want to put here is ok";
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;
    [cell.textLabel sizeToFit];

    return cell;
}

-2

আমি মনে করি না UITableViewCell'sএটি UILabelকরার জন্য আপনি বেস বেসে কার্পেট করতে পারেন। আপনি একটি নতুন যোগ করতে পারিনি UILabelসেল নিজেকে এবং ব্যবহার numberOfLinesসঙ্গে sizeToFitএটা উপযুক্তভাবে মাপ। কিছুটা এইরকম:

UILabel* label = [[UILabel alloc] initWithFrame:cell.frame];
label.numberOfLines = <...an appriate number of lines...>
label.text = <...your text...>
[label sizeToFit];
[cell addSubview:label];
[label release];
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.