177

プログラムで自動レイアウトを使用して完全にレイアウトされたビューがあります。ビューの中央に UITextView があり、その上下にアイテムがあります。すべて正常に動作しますが、テキストが追加されると UITextView を拡張できるようにしたいと考えています。これにより、拡張するにつれてその下のすべてが押し下げられます。

これを「スプリングとストラット」の方法で行う方法は知っていますが、これを行う自動レイアウトの方法はありますか? 私が考えることができる唯一の方法は、制約が成長する必要があるたびに制約を削除して再度追加することです。

4

17 に答える 17

575

概要: テキスト ビューのスクロールを無効にし、高さを制限しないでください。

これをプログラムで行うには、次のコードを に追加しますviewDidLoad

let textView = UITextView(frame: .zero, textContainer: nil)
textView.backgroundColor = .yellow // visual debugging
textView.isScrollEnabled = false   // causes expanding height
view.addSubview(textView)

// Auto Layout
textView.translatesAutoresizingMaskIntoConstraints = false
let safeArea = view.safeAreaLayoutGuide
NSLayoutConstraint.activate([
    textView.topAnchor.constraint(equalTo: safeArea.topAnchor),
    textView.leadingAnchor.constraint(equalTo: safeArea.leadingAnchor),
    textView.trailingAnchor.constraint(equalTo: safeArea.trailingAnchor)
])

Interface Builder でこれを行うには、テキスト ビューを選択し、属性インスペクターで Scrolling Enabled のチェックを外し、制約を手動で追加します。

注: テキスト ビューの上/下に他のビューがある場合は、 を使用しUIStackViewてそれらをすべて配置することを検討してください。

于 2014-01-22T15:38:17.813 に答える
-1

ところで、サブクラスを使用して固有のコンテンツ サイズをオーバーライドする拡張 UITextView を作成しました。独自の実装で調査したい UITextView のバグを発見しました。問題は次のとおりです。

一度に 1 文字ずつ入力すると、拡大するテキスト ビューは拡大するテキストに合わせて縮小します。しかし、たくさんのテキストを貼り付けると、下に伸びずにテキストが上にスクロールし、上部のテキストが見えなくなります。

解決策: サブクラスで setBounds: をオーバーライドします。なんらかの理由で、貼り付けにより、bounds.origin.y 値が非ジー (私が見たすべてのケースで 33) になりました。そこで、setBounds: を上書きして、bounds.origin.y を常にゼロに設定しました。問題を修正しました。

于 2014-09-05T00:03:42.927 に答える
-3
Obj C:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (nonatomic) UITextView *textView;
@end



#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize textView;

- (void)viewDidLoad{
    [super viewDidLoad];
    [self.view setBackgroundColor:[UIColor grayColor]];
    self.textView = [[UITextView alloc] initWithFrame:CGRectMake(30,10,250,20)];
    self.textView.delegate = self;
    [self.view addSubview:self.textView];
}

- (void)didReceiveMemoryWarning{
    [super didReceiveMemoryWarning];
}

- (void)textViewDidChange:(UITextView *)txtView{
    float height = txtView.contentSize.height;
    [UITextView beginAnimations:nil context:nil];
    [UITextView setAnimationDuration:0.5];

    CGRect frame = txtView.frame;
    frame.size.height = height + 10.0; //Give it some padding
    txtView.frame = frame;
    [UITextView commitAnimations];
}

@end
于 2016-01-22T05:27:23.317 に答える