web-dev-qa-db-ja.com

iOS7ではUITextViewコンテンツのサイズが異なります

「詳細」ボタンをタップすると展開できるUITextViewを使用しています。問題は次のとおりです。

IOS6ではこれを使用します

self.DescriptionTextView.text =  @"loong string";

if(self.DescriptionTextView.contentSize.height>self.DescriptionTextView.frame.size.height) { 
    //set up the more button
}

問題は、iOS7ではcontentSize.heightは、iOS6で返す値とは異なる値(はるかに小さい)を返します。どうしてこれなの?それを修正する方法は?

15
user1028028

コンテンツサイズプロパティは、iOS 6の場合とは異なり、機能しなくなりました。他の人が示唆しているようにsizeToFitを使用すると、さまざまな要因によって機能する場合と機能しない場合があります。

それは私にとってはうまくいかなかったので、代わりにこれを使用します:

- (CGFloat)measureHeightOfUITextView:(UITextView *)textView
{
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
    {
        // This is the code for iOS 7. contentSize no longer returns the correct value, so
        // we have to calculate it.
        //
        // This is partly borrowed from HPGrowingTextView, but I've replaced the
        // magic fudge factors with the calculated values (having worked out where
        // they came from)

        CGRect frame = textView.bounds;

        // Take account of the padding added around the text.

        UIEdgeInsets textContainerInsets = textView.textContainerInset;
        UIEdgeInsets contentInsets = textView.contentInset;

        CGFloat leftRightPadding = textContainerInsets.left + textContainerInsets.right + textView.textContainer.lineFragmentPadding * 2 + contentInsets.left + contentInsets.right;
        CGFloat topBottomPadding = textContainerInsets.top + textContainerInsets.bottom + contentInsets.top + contentInsets.bottom;

        frame.size.width -= leftRightPadding;
        frame.size.height -= topBottomPadding;

        NSString *textToMeasure = textView.text;
        if ([textToMeasure hasSuffix:@"\n"])
        {
            textToMeasure = [NSString stringWithFormat:@"%@-", textView.text];
        }

        // NSString class method: boundingRectWithSize:options:attributes:context is
        // available only on ios7.0 sdk.

        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        [paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping];

        NSDictionary *attributes = @{ NSFontAttributeName: textView.font, NSParagraphStyleAttributeName : paragraphStyle };

        CGRect size = [textToMeasure boundingRectWithSize:CGSizeMake(CGRectGetWidth(frame), MAXFLOAT)
                                                  options:NSStringDrawingUsesLineFragmentOrigin
                                               attributes:attributes
                                                  context:nil];

        CGFloat measuredHeight = ceilf(CGRectGetHeight(size) + topBottomPadding);
        return measuredHeight;
    }
    else
    {
        return textView.contentSize.height;
    }
}
58
tarmes

次のリンクで答えを試してください。layoutIfNeededcontentSizeの前に呼び出す必要があります。

iOS7 UITextView contentsize.height代替

答え:

IOS7では、UITextViewNSLayoutManagerを使用してテキストをレイアウトします。

// If YES, then the layout manager may perform glyph generation and layout for a given portion of the text, without having glyphs or layout for preceding portions.  The default is NO.  Turning this setting on will significantly alter which portions of the text will have glyph generation or layout performed when a given generation-causing method is invoked.  It also gives significant performance benefits, especially for large documents.
@property(NS_NONATOMIC_IOSONLY) BOOL allowsNonContiguousLayout;

allowsNonContiguousLayoutを無効にしてcontentSizeを修正します。

textView.layoutManager.allowsNonContiguousLayout = NO;
10
nova

これ リンク 答えがあるようです。

sizeToFitを使用する前に、contentSizeを使用する必要があります。

2
Puneet Sharma

次のコードで試してください。iOS6と7の両方で動作します。試してみてください。

CGSize myTextViewSize = [self.myTextView sizeThatFits:CGSizeMake(self.myTextView.frame.size.width, FLT_MAX)];
self.myTextView.height = myTextViewSize.height;
NSLog(@"%f", self.myTextView.height);
0
iPatel