سؤال

هذا هو على اي فون 0S 2.0.إجابات عن 2.1 جيدة جدا, على الرغم من أنني على علم بأي الخلافات بشأن الجداول.

فإنه يشعر وكأنه ينبغي أن يكون من الممكن الحصول على التفاف النص دون إنشاء مخصص الخلية ، منذ UITableViewCell يحتوي على UILabel بشكل افتراضي.وأنا أعلم أنني يمكن أن تجعل من العمل إذا كنت إنشاء مخصص الخلية ، ولكن ليس هذا ما أحاول تحقيق - أريد أن أفهم لماذا النهج الحالي لا يعمل.

لقد برزت هذه التسمية تم إنشاؤه على الطلب (منذ خلية تدعم النص والصورة الوصول لذلك لا إنشاء "طريقة عرض البيانات" حتى لزم الأمر) ، لذلك إذا كنت تفعل شيئا مثل هذا:

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

ثم أحصل على صالح التسمية ، ولكن الإعداد numberOfLines على أن (و lineBreakMode) لا يعمل - أنا لا يزال الحصول على سطر واحد من النص.هناك الكثير من ارتفاع في UILabel للاطلاع على النص لعرض أنا فقط أرد قيمة كبيرة بالنسبة للارتفاع في heightForRowAtIndexPath.

هل كانت مفيدة؟

المحلول

هنا هو أبسط طريقة و يعمل بالنسبة لي:

داخل 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.هذا يتيح لك استخدام العديد من خطوط ما يحتاج إليه.

الجزء التالي هو تحديد كيفية كبيرة الخاص بك 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 إلى إرجاع ارتفاع الخلية لأنني أحب قليلا العازلة حول النص.

نصائح أخرى

تحديث تيم روب الجواب على iOS7:

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

تعليق موجز / الجواب أن أسجل تجربتي عندما كان لدي نفس المشكلة.على الرغم من استخدام أمثلة التعليمات البرمجية عرض الجدول ارتفاع الخلية تم ضبط, ولكن التسمية داخل الخلية لا تزال ضبط بشكل صحيح - الحل هو أنني كنت التحميل هاتفي من مخصص الاستثمار القومي الملف الذي يحدث بعد ارتفاع الخلية في تعديلها.

وكان الإعدادات داخل ملف بنك الاستثمار القومي إلى التفاف النص فقط 1 خط التسمية;بنك الاستثمار القومي ملف الإعدادات تجاوز إعدادات أنا تعديلها داخل البرمجية.

الدرس أخذت للتأكد من أن نضع في اعتبارنا دائما ما للدولة من الكائنات هي في كل وقت من الأوقات - قد لم يتم إنشاؤه حتى الآن!...hth شخص أسفل الخط.

إذا أردنا إضافة النص فقط في 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"];

الآن tableviews يمكن أن يكون ذاتيا تحجيم الخلايا.تعيين عرض الجدول على النحو التالي

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

أبل المرجعية

يمكنني استخدام الحلول التالية.

يتم توفير البيانات بشكل منفصل في الأعضاء:

-(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 en بود 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;    
}

لقد وجدت هذا أن تكون بسيطة جدا ومباشرة :

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

مثلا:

[self.tableView setRowHeight:80.0f];

هذا قد أو قد لا يكون أفضل / نهج موحد للقيام بذلك, لكنه يعمل في حالتي.

محاولة قانون بلدي في سويفت .وسوف يعمل هذا الرمز الطبيعي UILabels أيضا.

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 

وأعتقد أن هذا هو أفضل وأقصر حل.مجرد تنسيق 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;
}

أنا لا أعتقد أنك يمكن التعامل مع قاعدة 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];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top