65

私はここで受け入れられた答えを何年も使用してきました。

iOS 7 では、テキスト コンテンツに関係なく、contentSize.height は frame.height-8 になります。

iOS 7 で高さを調整する作業方法は何ですか?

4

14 に答える 14

33

自動レイアウトを使用しているため、 の値を使用してのheight[textView sizeThatFits:CGSizeMake(textView.frame.size.width, CGFLOAT_MAX)].heightを更新します。constanttextViewUILayoutConstraint

于 2013-10-17T20:17:50.103 に答える
15

自動レイアウトを使用している場合はUITextView、コンテンツに合わせてテキスト ビューの高さを自動調整する単純なサブクラスを作成できます。

@interface ContentHeightTextView : UITextView

@end

@interface ContentHeightTextView ()
@property (nonatomic, strong) NSLayoutConstraint *heightConstraint;
@end

@implementation ContentHeightTextView

- (void)layoutSubviews
{
    [super layoutSubviews];

    CGSize size = [self sizeThatFits:CGSizeMake(self.bounds.size.width, FLT_MAX)];

    if (!self.heightConstraint) {
        self.heightConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:1.0f constant:size.height];
        [self addConstraint:self.heightConstraint];
    }

    self.heightConstraint.constant = size.height;

    [super layoutSubviews];
}

@end

もちろん、テキスト ビューの幅と位置は、プログラムの他の場所で構成された追加の制約によって定義する必要があります。

IB でこのカスタム テキスト ビューを作成する場合は、Xcode を満たすためにテキスト ビューに高さの制約を与えます。IB で作成された高さの制約が単なるプレースホルダーであることを確認してください (つまり、「ビルド時に削除」というボックスにチェックを入れてください)。

ここに画像の説明を入力

サブクラスを実装する別の方法UITextViewは次のとおりです (この実装はベスト プラクティスとして認められる場合があります)。

@interface ContentHeightTextView ()
@property (nonatomic, strong) NSLayoutConstraint *heightConstraint;
@end

@implementation ContentHeightTextView

- (void)layoutSubviews
{
    [super layoutSubviews];

    [self setNeedsUpdateConstraints];
}

- (void)updateConstraints
{
    CGSize size = [self sizeThatFits:CGSizeMake(self.bounds.size.width, FLT_MAX)];

    if (!self.heightConstraint) {
        self.heightConstraint = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:1.0f constant:size.height];
        [self addConstraint:self.heightConstraint];
    }

    self.heightConstraint.constant = size.height;
    [super updateConstraints];
}

@end
于 2014-02-23T08:25:01.003 に答える
4

自動レイアウトを使用している場合は、固有の高さを追加する次の UITextView サブクラスを使用できます。

@implementation SelfSizingTextView

- (void)setText:(NSString *)text
{
    [super setText:text];
    [self invalidateIntrinsicContentSize];
}

- (void)setFont:(UIFont *)font
{
    [super setFont:font];
    [self invalidateIntrinsicContentSize];
}

- (CGSize)intrinsicContentSize
{
    CGFloat width = self.frame.size.width;
    CGSize size = [self sizeThatFits:CGSizeMake(width, MAXFLOAT)];
    return CGSizeMake(UIViewNoIntrinsicMetric, size.height);
}

@end
于 2014-12-05T22:08:05.187 に答える
1

iOS 7 以降を使用している場合は、自動レイアウトをオンにし、テキスト ビューの各辺を親ビューの端に固定するだけで問題なく動作します。追加のコードは必要ありません。

于 2015-03-08T00:05:37.107 に答える
0

私はカテゴリを書きましたUITextView

- (CGSize)intrinsicContentSize {
    return self.contentSize;
}

- (void)setContentSize:(CGSize)contentSize {
    [super setContentSize:contentSize];
    [self invalidateIntrinsicContentSize];
}

UIKit設定するcontentSizeと、 がUITextView調整されますintrinsic content size。それはうまく機能しautolayoutます。

于 2016-03-30T16:14:01.743 に答える
0

autolayout を使用していて sizetofit が機能しない場合は、幅の制約を一度確認してください。幅の制約を逃した場合、高さは正確になります。

他の API を使用する必要はありません。たった1行ですべての問題が解決します。

[_textView sizeToFit];

ここでは、高さだけに関心があり、幅を固定したままにして、ストーリーボードの TextView の幅の制約を逃していました。

これは、サービスからの動的コンテンツを表示するためのものでした。

これが役立つことを願っています..

于 2015-01-02T07:02:52.013 に答える