แทนที่ขนาดที่ไม่รองรับด้วย: ใน iOS 7?


คำตอบ:


521

ใช้แทนซึ่งตอนนี้จะใช้เวลาsizeWithAttributes: NSDictionaryผ่านคู่กับคีย์UITextAttributeFontและวัตถุแบบอักษรของคุณเช่นนี้:

CGSize size = [string sizeWithAttributes:
    @{NSFontAttributeName: [UIFont systemFontOfSize:17.0f]}];

// Values are fractional -- you should take the ceilf to get equivalent values
CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));

60
เมื่อทำงานกับNSStringa และUILabel(ไม่ใช่กรณีเสมอ แต่บ่อยครั้งนั้น) เพื่อป้องกันรหัสซ้ำ / ฯลฯ คุณสามารถแทนที่[UIFont systemFontOfSize:17.0f]ด้วยlabel.font- ช่วยบำรุงรักษาโค้ดโดยอ้างอิงข้อมูลที่มีอยู่กับคุณพิมพ์หลายครั้งหรืออ้างอิงค่าคงที่ทั่ว สถานที่ ฯลฯ
toblerpwn

8
@toblerpwn เป็นไปได้ว่าไม่มีป้ายกำกับอยู่และคุณกำลังพยายามคำนวณป้ายกำกับเชิงทฤษฎี
botbot

5
ฉันจะใช้ตัวอย่างนี้เพื่อให้ได้ขนาดความสูงด้วยป้ายชื่อที่มีความกว้างคงที่เช่น 250 ได้อย่างไร หรือถ้ามันเป็นฉลากที่มีแม่มด autolatyout จะเพิ่มความกว้างและฉันไปที่ landscapemode
Pedroinpeace

12
@Pedroinpeace คุณจะใช้boundingRectWithSize:options:attributes:context:แทนโดยผ่านในCGSizeMake(250.0f, CGFLOAT_MAX)กรณีส่วนใหญ่
James Kuang

9
สิ่งอื่นที่ควรทราบ sizeWithAttributes: ไม่เทียบเท่า 100% sizeWithFont ใช้เพื่อปัดเศษขนาดเป็นจำนวนเต็ม (พิกเซล) ค่า แนะนำให้ใช้ ceilf กับความสูง / ความกว้างผลลัพธ์หรือคุณอาจได้รับสิ่งประดิษฐ์พร่ามัว (esp non retina HW) หากคุณใช้สิ่งนี้ในการคำนวณตำแหน่ง
Nick H247

172

ฉันเชื่อว่าฟังก์ชั่นถูกคัดค้านเนื่องจากชุดของNSString+UIKitฟังก์ชัน ( sizewithFont:...และอื่น ๆ ) นั้นอ้างอิงจากUIStringDrawingไลบรารีซึ่งไม่ได้เป็นเธรดที่ปลอดภัย หากคุณพยายามเรียกใช้พวกเขาไม่ได้อยู่ในเธรดหลัก (เช่นUIKitฟังก์ชันอื่น ๆ) คุณจะได้รับพฤติกรรมที่คาดเดาไม่ได้ โดยเฉพาะอย่างยิ่งหากคุณใช้งานฟังก์ชั่นบนหลาย ๆ เธรดพร้อมกันมันอาจจะทำให้แอพของคุณขัดข้อง นี่คือเหตุผลที่ใน iOS 6 ที่พวกเขานำมาใช้เป็นวิธีการboundingRectWithSize:... NSAttributedStringสิ่งนี้ถูกสร้างขึ้นบนNSStringDrawingห้องสมุดและเป็นเธรดที่ปลอดภัย

ถ้าคุณดูที่ใหม่ฟังก์ชั่นก็ขออาร์เรย์แอตทริบิวต์ในลักษณะเช่นเดียวกับNSString boundingRectWithSize:... NSAttributeStringถ้าฉันต้องเดาว่าNSStringฟังก์ชั่นใหม่ใน iOS 7 นี้เป็นเพียงแค่ wrapper สำหรับNSAttributeStringฟังก์ชั่นจาก iOS 6

เมื่อทราบว่าถ้าคุณเป็นเพียงการสนับสนุน iOS 6 และ iOS 7 แล้วแน่นอนฉันจะเปลี่ยนทุกที่ที่คุณไปNSString sizeWithFont:... NSAttributeString boundingRectWithSizeมันจะช่วยให้คุณปวดหัวได้มากหากคุณมีกระเป๋าใส่มุมแบบมัลติเธรดที่แปลก! นี่คือวิธีการแปลงของฉันNSString sizeWithFont:constrainedToSize::

สิ่งที่เคยเป็น:

NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
CGSize size = [text sizeWithFont:font 
               constrainedToSize:(CGSize){width, CGFLOAT_MAX}];

สามารถแทนที่ด้วย:

NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
NSAttributedString *attributedText =
    [[NSAttributedString alloc] initWithString:text 
                                    attributes:@{NSFontAttributeName: font}];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
                                           options:NSStringDrawingUsesLineFragmentOrigin
                                           context:nil];
CGSize size = rect.size;

โปรดทราบเอกสารดังกล่าว:

ใน iOS 7 และใหม่กว่าวิธีการนี้จะคืนขนาดเศษส่วน (ในองค์ประกอบขนาดของที่ส่งคืนCGRect); ในการใช้มุมมองขนาดที่คืนสู่ขนาดคุณต้องใช้เพิ่มค่าเป็นจำนวนเต็มที่สูงกว่าที่ใกล้ที่สุดโดยใช้ฟังก์ชั่น ceil

ดังนั้นเพื่อดึงความสูงหรือความกว้างที่คำนวณได้เพื่อนำมาใช้สำหรับการปรับขนาดมุมมองฉันจะใช้:

CGFloat height = ceilf(size.height);
CGFloat width  = ceilf(size.width);

boundingRectWithSize เลิกใช้แล้วใน iOS 6.0
Nirav

2
@Nirav ฉันไม่เห็นพูดถึงการคัดค้าน คุณช่วยชี้ฉันไปที่ที่บอกว่าเลิกใช้แล้วได้ไหม ขอบคุณ! ( developer.apple.com/library/ios/documentation/uikit/reference/ ...... )
Mr. T

2
@Nirav อาจหมายความว่าไม่สามารถใช้งานกับNSStringใน iOS 6 ได้ (ซึ่งคำตอบนี้พูดถึงทางอ้อม)
นิวแลนด์แลนเดอร์

1
@VagueExplanation ฉันเพิ่งลองมันและ boundingRectForSize ยังไม่เลิกใช้สำหรับ NSAttributedString นอกจากนี้ยังไม่ได้บอกว่าเลิกใช้ในเอกสารประกอบ
นาย T

5
ยอดเยี่ยมสำหรับการกล่าวถึงการใช้ ceilf () ไม่มีที่ใดที่กล่าวถึงและขนาดของฉันเล็กไปหน่อยเสมอ ขอบคุณ!
Jonathan Brown

29

ที่คุณสามารถดูได้ที่เว็บไซต์ของผู้พัฒนาแอปเปิ้ลก็จะเลิกดังนั้นเราจำเป็นต้องใช้sizeWithFontsizeWithAttributes

#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

NSString *text = @"Hello iOS 7.0";
if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
    // code here for iOS 5.0,6.0 and so on
    CGSize fontSize = [text sizeWithFont:[UIFont fontWithName:@"Helvetica" 
                                                         size:12]];
} else {
    // code here for iOS 7.0
   CGSize fontSize = [text sizeWithAttributes: 
                            @{NSFontAttributeName: 
                              [UIFont fontWithName:@"Helvetica" size:12]}];
}

17
ในกรณีนี้ดีกว่าที่จะใช้[NSObject respondsToSelector:]วิธีการเช่นที่นี่: stackoverflow.com/a/3863039/1226304
derpoliuk

16

ฉันสร้างหมวดหมู่เพื่อจัดการปัญหานี้นี่คือ:

#import "NSString+StringSizeWithFont.h"

@implementation NSString (StringSizeWithFont)

- (CGSize) sizeWithMyFont:(UIFont *)fontToUse
{
    if ([self respondsToSelector:@selector(sizeWithAttributes:)])
    {
        NSDictionary* attribs = @{NSFontAttributeName:fontToUse};
        return ([self sizeWithAttributes:attribs]);
    }
    return ([self sizeWithFont:fontToUse]);
}

วิธีนี้คุณจะต้องค้นหา / แทนที่sizeWithFont:ด้วยsizeWithMyFont:และคุณก็พร้อมที่จะไป


1
แม้ว่าสิ่งนี้จะสร้างคำเตือนคอมไพเลอร์บน ios7 + สำหรับการอ้างอิง sizeWithFont หรือการรวบรวมคำเตือน / ข้อผิดพลาดใน <ios7 สำหรับการอ้างอิง sizeWithAttributes! น่าจะดีที่สุดที่จะใช้แมโครแทนการตรวจสอบการตอบสนองต่อ Selector - ถ้าจำเป็น แต่เนื่องจากคุณไม่สามารถส่งมอบแอปเปิ้ลด้วย ioS6 SDK ได้อีก ... อาจเป็นไปไม่ได้!
Nick H247

เพิ่มสิ่งนี้ลงใน supress warning #pragma การวินิจฉัย GCC ถูกละเว้น "-Wdeprecated-declarations"
Ryan Heitner

10

ใน iOS7 ฉันต้องการตรรกะในการคืนความสูงที่ถูกต้องสำหรับ tableview: heightForRowAtIndexPath วิธีการ แต่ sizeWithAttributes มักจะส่งกลับความสูงเดียวกันเสมอโดยไม่คำนึงถึงความยาวของสตริงเพราะไม่รู้ว่ามันจะอยู่ในเซลล์ตารางความกว้างคงที่ . ฉันพบว่ามันใช้งานได้ดีสำหรับฉันและคำนวณความสูงที่ถูกต้องโดยคำนึงถึงความกว้างของเซลล์ตาราง! นี่คือคำตอบของมิสเตอร์ทีด้านบน

NSString *text = @"The text that I want to wrap in a table cell."

CGFloat width = tableView.frame.size.width - 15 - 30 - 15;  //tableView width - left border width - accessory indicator - right border width
UIFont *font = [UIFont systemFontOfSize:17];
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: font}];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
                                           options:NSStringDrawingUsesLineFragmentOrigin
                                           context:nil];
CGSize size = rect.size;
size.height = ceilf(size.height);
size.width  = ceilf(size.width);
return size.height + 15;  //Add a little more padding for big thumbs and the detailText label

7

ป้ายกำกับหลายบรรทัดที่ใช้ความสูงแบบไดนามิกอาจต้องการข้อมูลเพิ่มเติมเพื่อกำหนดขนาดให้ถูกต้อง คุณสามารถใช้ sizeWithAttributes กับ UIFont และ NSParagraphStyle เพื่อระบุทั้งแบบอักษรและโหมดการแบ่งบรรทัด

คุณจะกำหนดลักษณะย่อหน้าและใช้ NSDictionary เช่นนี้:

// set paragraph style
NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
[style setLineBreakMode:NSLineBreakByWordWrapping];
// make dictionary of attributes with paragraph style
NSDictionary *sizeAttributes        = @{NSFontAttributeName:myLabel.font, NSParagraphStyleAttributeName: style};
// get the CGSize
CGSize adjustedSize = CGSizeMake(label.frame.size.width, CGFLOAT_MAX);

// alternatively you can also get a CGRect to determine height
CGRect rect = [myLabel.text boundingRectWithSize:adjustedSize
                                                         options:NSStringDrawingUsesLineFragmentOrigin
                                                      attributes:sizeAttributes
                                                         context:nil];

คุณสามารถใช้ CGSize 'modifiedSize' หรือ CGRect เป็นคุณสมบัติ rect.size.height หากคุณต้องการความสูง

ข้อมูลเพิ่มเติมเกี่ยวกับ NSParagraphStyle ที่นี่: https://developer.apple.com/library/mac/documentation/cocoa/reference/applicationkit/classes/NSParagraphStyle_Class/Reference/Reference.html


1
ดูเหมือนว่ามีปัญหาเกี่ยวกับไวยากรณ์ทันทีหลังจากปรับขนาดแล้ว
Chris Prince

ขอขอบคุณที่
ติดตาม

6
// max size constraint
CGSize maximumLabelSize = CGSizeMake(184, FLT_MAX)

// font
UIFont *font = [UIFont fontWithName:TRADE_GOTHIC_REGULAR size:20.0f];

// set paragraph style
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;

// dictionary of attributes
NSDictionary *attributes = @{NSFontAttributeName:font,
                             NSParagraphStyleAttributeName: paragraphStyle.copy};

CGRect textRect = [string boundingRectWithSize: maximumLabelSize
                                     options:NSStringDrawingUsesLineFragmentOrigin
                                  attributes:attributes
                                     context:nil];

CGSize expectedLabelSize = CGSizeMake(ceil(textRect.size.width), ceil(textRect.size.height));

1
สิ่งนี้ช่วยให้ฉันปวดหัวหลายชั่วโมงขอบคุณ Kirit การกำหนดคุณสมบัติและพจนานุกรมก่อนบล็อก CGRect คือสิ่งที่ทำให้ฉัน ... อ่านได้ง่ายขึ้นอีกด้วย
Azin Mehrnoosh

3

สร้างฟังก์ชันที่ใช้อินสแตนซ์ของ UILabel และส่งคืน CGSize

CGSize constraint = CGSizeMake(label.frame.size.width , 2000.0);
// Adjust according to requirement

CGSize size;
if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0){

    NSRange range = NSMakeRange(0, [label.attributedText length]);

    NSDictionary *attributes = [label.attributedText attributesAtIndex:0 effectiveRange:&range];
    CGSize boundingBox = [label.text boundingRectWithSize:constraint options: NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil].size;

    size = CGSizeMake(ceil(boundingBox.width), ceil(boundingBox.height));
}
else{
    size = [label.text sizeWithFont:label.font constrainedToSize:constraint lineBreakMode:label.lineBreakMode];
}

return size;

ฉันกรณีของฉันสำหรับ dynamicaly Row height ฉันได้ลบวิธี HeightForRow ทั้งหมดแล้วและใช้ UITableViewAutomaticDimension tableView.estimatedRowHeight = 68.0 tableView.rowHeight = UITableViewAutomaticDimension
Eugene Braginets

3

ทางเลือก -

CGSize expectedLabelSize;
if ([subTitle respondsToSelector:@selector(sizeWithAttributes:)])
{
    expectedLabelSize = [subTitle sizeWithAttributes:@{NSFontAttributeName:subTitleLabel.font}];
}else{
    expectedLabelSize = [subTitle sizeWithFont:subTitleLabel.font constrainedToSize:subTitleLabel.frame.size lineBreakMode:NSLineBreakByWordWrapping];
}

1
สิ่งนี้จะสร้างคำเตือนคอมไพเลอร์ทั้งบน iOS6 และ 7 และจะมีพฤติกรรมที่แตกต่างกันสำหรับแต่ละคน!
Nick H247

3

สร้างบน @bitsand นี่เป็นวิธีใหม่ที่ฉันเพิ่งเพิ่มในหมวดหมู่ NSString + Extras ของฉัน:

- (CGRect) boundingRectWithFont:(UIFont *) font constrainedToSize:(CGSize) constraintSize lineBreakMode:(NSLineBreakMode) lineBreakMode;
{
    // set paragraph style
    NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
    [style setLineBreakMode:lineBreakMode];

    // make dictionary of attributes with paragraph style
    NSDictionary *sizeAttributes = @{NSFontAttributeName:font, NSParagraphStyleAttributeName: style};

    CGRect frame = [self boundingRectWithSize:constraintSize options:NSStringDrawingUsesLineFragmentOrigin attributes:sizeAttributes context:nil];

    /*
    // OLD
    CGSize stringSize = [self sizeWithFont:font
                              constrainedToSize:constraintSize
                                  lineBreakMode:lineBreakMode];
    // OLD
    */

    return frame;
}

ฉันแค่ใช้ขนาดของเฟรมที่ได้


2

sizeWithFontคุณยังสามารถใช้ แต่ใน iOS> = 7.0 วิธีสาเหตุ crashing \nถ้าสตริงชั้นนำและมีช่องว่างต่อท้ายหรือเส้นปลาย

ตัดข้อความก่อนใช้งาน

label.text = [label.text stringByTrimmingCharactersInSet:
             [NSCharacterSet whitespaceAndNewlineCharacterSet]];

ที่ยังอาจนำไปใช้และsizeWithAttributes[label sizeToFit]

นอกจากนี้เมื่อใดก็ตามที่คุณมีnsstringdrawingtextstorage message sent to deallocated instanceในอุปกรณ์ iOS 7.0 มันเกี่ยวข้องกับเรื่องนี้


2

ใช้มิติอัตโนมัติที่ดีขึ้น (Swift):

  tableView.estimatedRowHeight = 68.0
  tableView.rowHeight = UITableViewAutomaticDimension

หมายเหตุ: 1. ต้นแบบ UITableViewCell ควรได้รับการออกแบบอย่างเหมาะสม (ตัวอย่างเช่นอย่าลืมตั้งค่า UILabel.numberOfLines = 0 ฯลฯ ) 2. ลบเมธอด HeightForRowAtIndexPath

ป้อนคำอธิบายรูปภาพที่นี่

วิดีโอ: https://youtu.be/Sz3XfCsSb6k


มันต้องใช้ความสูงของเซลล์คงที่ซึ่งกำหนดไว้ในเซลล์ต้นแบบของสตอรี่บอร์ด
Kirit Vaghela

เพิ่มสองบรรทัดเหล่านั้นและทำให้แน่ใจว่า UILabel ของฉันถูกตั้งค่าเป็น 0 จำนวนบรรทัด ไม่ทำงานตามที่โฆษณาไว้ คุณทำอะไรเพื่อให้มันใช้งานได้กับโค้ดสองบรรทัดนี้เท่านั้น?
จะ

1
อืมคุณต้องตรึงข้อ จำกัด ของฉลากไว้ที่ด้านบนและด้านล่างของเซลล์ด้วย
Eugene Braginets

1
ไม่ควรจะเพียงพอ คุณมีข้อ จำกัด อัตโนมัติในการกำหนดป้ายกำกับไว้ที่กำกับดูแลหรือไม่?
Eugene Braginets



1

ในฐานะที่เป็น @Ayush คำตอบ:

ที่คุณสามารถดูได้ที่เว็บไซต์ของผู้พัฒนาแอปเปิ้ลก็จะเลิกดังนั้นเราจำเป็นต้องใช้sizeWithFontsizeWithAttributes

ดีสมมติว่าใน 2019+ คุณอาจจะใช้สวิฟท์และStringแทน Objective-C และNSStringนี่คือวิธีที่ถูกต้องจะได้รับขนาดของที่Stringมีตัวอักษรที่กำหนดไว้ล่วงหน้า:

let stringSize = NSString(string: label.text!).size(withAttributes: [.font : UIFont(name: "OpenSans-Regular", size: 15)!])

คุณจะใช้สิ่งนี้เพื่อกำหนดขนาดตัวอักษรได้อย่างไร?
Joseph Astrahan

@JosephAstrahan สิ่งนี้ไม่ได้มีไว้สำหรับกำหนดขนาดตัวอักษร แต่สำหรับการรับขนาด (CGSize) ของสตริงที่มีแบบอักษรที่กำหนด หากคุณต้องการได้ขนาดตัวอักษรของป้ายกำกับคุณสามารถใช้ label ได้อย่างง่ายดาย
Romulo BM

ใช้ความคิดของคุณฉันสร้างวิธีที่จะทำให้ขนาดตัวอักษรมากขึ้นหรือน้อยลง ( stackoverflow.com/questions/61651614/ … ), label.font จะไม่ทำงานในกรณีของฉันเนื่องจากปัญหาที่ซับซ้อนบางอย่างที่มีป้ายกำกับคลิกได้เฉพาะเมื่อ ตัวอักษรที่แน่นอนเป็นที่รู้จักกันคุณสามารถอ่านได้ในโพสต์ของฉัน
Joseph Astrahan

0
- (CGSize) sizeWithMyFont:(UIFont *)fontToUse
{
    if ([self respondsToSelector:@selector(sizeWithAttributes:)])
    {
        NSDictionary* attribs = @{NSFontAttributeName:fontToUse};
        return ([self sizeWithAttributes:attribs]);
    }
    return ([self sizeWithFont:fontToUse]);
}

0

นี่คือเทียบเท่า monotouch ถ้าใครต้องการมัน:

/// <summary>
/// Measures the height of the string for the given width.
/// </summary>
/// <param name="text">The text.</param>
/// <param name="font">The font.</param>
/// <param name="width">The width.</param>
/// <param name="padding">The padding.</param>
/// <returns></returns>
public static float MeasureStringHeightForWidth(this string text, UIFont font, float width, float padding = 20)
{
    NSAttributedString attributedString = new NSAttributedString(text, new UIStringAttributes() { Font = font });
    RectangleF rect = attributedString.GetBoundingRect(new SizeF(width, float.MaxValue), NSStringDrawingOptions.UsesLineFragmentOrigin, null);
    return rect.Height + padding;
}

ซึ่งสามารถใช้ดังนี้:

public override float GetHeightForRow(UITableView tableView, NSIndexPath indexPath)
{
    //Elements is a string array
    return Elements[indexPath.Row].MeasureStringHeightForWidth(UIFont.SystemFontOfSize(UIFont.LabelFontSize), tableView.Frame.Size.Width - 15 - 30 - 15);
}

0
CGSize maximumLabelSize = CGSizeMake(label.frame.size.width, FLT_MAX);
CGSize expectedLabelSize = [label sizeThatFits:maximumLabelSize];
float heightUse = expectedLabelSize.height;


-1

สิ่งนี้ไม่ได้ผลสำหรับฉันใน iOS 7 นี่คือสิ่งที่ฉันทำ ฉันวางสิ่งนี้ลงในคลาสเซลล์ที่กำหนดเองของฉันและเรียกใช้วิธีการใน heightForCellAtIndexPath ของฉัน

เซลล์ของฉันมีลักษณะคล้ายกับเซลล์คำอธิบายเมื่อดูแอพใน App Store

ขั้นแรกในกระดานเรื่องราวตั้งป้ายกำกับของคุณเป็น 'formededText' ตั้งค่าจำนวนบรรทัดเป็น 0 (ซึ่งจะปรับขนาดป้ายกำกับโดยอัตโนมัติ (iOS 6+ เท่านั้น)) และตั้งเป็นตัดคำ

จากนั้นฉันก็เพิ่มความสูงทั้งหมดของเนื้อหาของเซลล์ใน Cell Class ที่กำหนดเองของฉัน ในกรณีของฉันฉันมีป้ายกำกับที่ด้านบนที่มักจะพูดว่า "คำอธิบาย" (_descriptionHeadingLabel) ป้ายกำกับขนาดเล็กที่แปรผันตามขนาดที่มีคำอธิบายจริง (_descriptionLabel) ข้อ จำกัด จากด้านบนของเซลล์ไปยังส่วนหัว (_descriptionHeadingLabelTopConstraint) . ฉันเพิ่ม 3 ลงในช่องว่างด้านล่างเล็กน้อย (ประมาณแอปเปิ้ลที่มีจำนวนเท่ากันในเซลล์ประเภทคำบรรยาย)

- (CGFloat)calculateHeight
{
    CGFloat width = _descriptionLabel.frame.size.width;
    NSAttributedString *attributedText = _descriptionLabel.attributedText;
    CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX} options: NSStringDrawingUsesLineFragmentOrigin context:nil];

    return rect.size.height + _descriptionHeadingLabel.frame.size.height + _descriptionHeadingLabelTopConstraint.constant + 3;
}

และในตัวแทนของ Table View ของฉัน:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
    if (indexPath.row == 0) {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"descriptionCell"];
        DescriptionCell *descriptionCell = (DescriptionCell *)cell;
        NSString *text = [_event objectForKey:@"description"];
        descriptionCell.descriptionLabel.text = text;

        return [descriptionCell calculateHeight];
    }

    return 44.0f;
}

คุณสามารถเปลี่ยนคำสั่ง if ให้เล็กขึ้นอย่างชาญฉลาดและรับตัวระบุเซลล์จากแหล่งข้อมูลบางประเภท ในกรณีของฉันเซลล์จะถูกเข้ารหัสอย่างหนักเนื่องจากจะมีจำนวนคงที่ตามลำดับเฉพาะ


boundingRectWithSizeใน iOS 9.2 ปัญหาปัจจุบันคือผลลัพธ์ที่แตกต่างกับ iOS <9.2 คุณพบหรือรู้วิธีที่ดีที่สุดในการทำสิ่งนี้
jose920405
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.