私はここで受け入れられた答えを何年も使用してきました。
iOS 7 では、テキスト コンテンツに関係なく、contentSize.height は frame.height-8 になります。
iOS 7 で高さを調整する作業方法は何ですか?
私はここで受け入れられた答えを何年も使用してきました。
iOS 7 では、テキスト コンテンツに関係なく、contentSize.height は frame.height-8 になります。
iOS 7 で高さを調整する作業方法は何ですか?
自動レイアウトを使用しているため、 の値を使用してのheight[textView sizeThatFits:CGSizeMake(textView.frame.size.width, CGFLOAT_MAX)].height
を更新します。constant
textView
UILayoutConstraint
自動レイアウトを使用している場合は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
自動レイアウトを使用している場合は、固有の高さを追加する次の 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
iOS 7 以降を使用している場合は、自動レイアウトをオンにし、テキスト ビューの各辺を親ビューの端に固定するだけで問題なく動作します。追加のコードは必要ありません。
私はカテゴリを書きましたUITextView
:
- (CGSize)intrinsicContentSize {
return self.contentSize;
}
- (void)setContentSize:(CGSize)contentSize {
[super setContentSize:contentSize];
[self invalidateIntrinsicContentSize];
}
をUIKit
設定するcontentSize
と、 がUITextView
調整されますintrinsic content size
。それはうまく機能しautolayout
ます。
autolayout を使用していて sizetofit が機能しない場合は、幅の制約を一度確認してください。幅の制約を逃した場合、高さは正確になります。
他の API を使用する必要はありません。たった1行ですべての問題が解決します。
[_textView sizeToFit];
ここでは、高さだけに関心があり、幅を固定したままにして、ストーリーボードの TextView の幅の制約を逃していました。
これは、サービスからの動的コンテンツを表示するためのものでした。
これが役立つことを願っています..