編集可能なUITextView
(UISplitView
のデリゲートとして機能するUITextView
内の単純なUIViewController内に配置)が最初からテキストを表示せず、何か後に表示される可能性はありますか6〜7行のように?
私は特定の自動レイアウトなどを設定しませんでした。テキストを削除しようとしても役に立ちません(したがって、隠し文字などはありません)。
私はiPadでiOS 7を使用しています。ストーリーボードでは見栄えがいいです...問題はiOSシミュレーターと実際のデバイスで同じです。私は怒っています:P
ここにいくつかのコードがあります。これはViewController viewDidLoad()
です
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.itemTextField.delegate = self;
self.itemTextField.text = NSLocalizedString(@"NEWITEMPLACEHOLDER", nil);
self.itemTextField.textColor = [UIColor lightGrayColor]; //optional
}
そして、ここにUITextView
のオーバーライドされた関数があります。StackOverflowで見つけたコードを使用して、ビューのプレースホルダーをシミュレートしています(iPhoneバージョンのストーリーボードと同じものが正常に機能します)...
// UITextView placeholder
- (void)textViewDidBeginEditing:(UITextView *)textView
{
if ([textView.text isEqualToString:NSLocalizedString(@"NEWITEMPLACEHOLDER", nil)]) {
textView.text = @"";
textView.textColor = [UIColor blackColor]; //optional
}
[textView becomeFirstResponder];
}
- (void)textViewDidEndEditing:(UITextView *)textView
{
if ([textView.text isEqualToString:@""]) {
textView.text = NSLocalizedString(@"NEWITEMPLACEHOLDER", nil);
textView.textColor = [UIColor lightGrayColor]; //optional
}
[textView resignFirstResponder];
}
-(void)textViewDidChange:(UITextView *)textView
{
int len = textView.text.length;
charCount.text = [NSString stringWithFormat:@"%@: %i", NSLocalizedString(@"CHARCOUNT", nil),len];
}
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
return YES;
}
テキストを渡した後、-sizeToFit
を呼び出してみてください。この答えは、 ILabel内のテキストを垂直方向に整列させる に役立ちます。
[更新]
この回答を更新し、読みやすくします。
問題は、iOS7から、UINavigationControllerやUITabbarControllerなどのコンテナービューコントローラーがスクロールビュー(またはそれを継承するビュー)のコンテンツインセットを変更して、コンテンツの重複を回避できることです。これは、スクロールビューがメインビューまたは最初のサブビューである場合にのみ発生します。これを回避するには、automaticallyAdjustsScrollViewInsets
をNOに設定するか、このメソッドをオーバーライドしてNOを返すことにより、この動作を無効にする必要があります。
私は同じ種類の問題を乗り越えました。
自動scrollViewインセット調整を無効にすることで解決しました:
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")){
self.automaticallyAdjustsScrollViewInsets = NO; // Avoid the top UITextView space, iOS7 (~bug?)
}
これはかなり一般的な問題なので、単純なUITextViewサブクラスを作成して、再利用してIBで使用できるようにします。
代わりにcontentInsetを使用して、contentSizeがtextViewの境界よりも大きい場合を適切に処理するようにします
@interface BSVerticallyCenteredTextView : UITextView
@end
@implementation BSVerticallyCenteredTextView
- (id)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame])
{
[self addObserver:self forKeyPath:@"contentSize" options: (NSKeyValueObservingOptionNew) context:NULL];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder])
{
[self addObserver:self forKeyPath:@"contentSize" options: (NSKeyValueObservingOptionNew) context:NULL];
}
return self;
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"contentSize"])
{
UITextView *tv = object;
CGFloat deadSpace = ([tv bounds].size.height - [tv contentSize].height);
CGFloat inset = MAX(0, deadSpace/2.0);
tv.contentInset = UIEdgeInsetsMake(inset, tv.contentInset.left, inset, tv.contentInset.right);
}
}
- (void)dealloc
{
[self removeObserver:self forKeyPath:@"contentSize"];
}
@end
-observerForKeyPath
KeyPathとともに-contentSize
を使用します
マイブログのコードをご覧ください(タイ語言語に焦点を当てないでください)
http://www.macbaszii.com/2012/10/ios-dev-uitextview-vertical-alignment.html
Kiattisakに触発され、UITextView
のカテゴリとして垂直方向の配置を実装しました。これにより、レガシーUITextView
のvertical配置を制御できます。
Gist here として見つけることができます。
Tanguy.Gの回答の迅速なバージョン:
if(UIDevice.currentDevice().systemVersion >= "7.0") {
self.automaticallyAdjustsScrollViewInsets = false; // Avoid the top UITextView space, iOS7 (~bug?)
}
IOS 8.1でも同じ問題が発生しましたが、これらの提案はいずれも機能しませんでした。
did作業は、ストーリーボードに移動し、UITableView
またはUITextView
をドラッグして、それがなくなるようにすることでした。画面のUIView
の最初のサブビュー。
http://www.codeproject.com/Tips/852308/Bug-in-XCode-Vertical-Gap-Above-UITableView
UIView
にUINavigationController
が埋め込まれていることにリンクしているようです。
バグ?バグ? 「バグ」と言いましたか...?
;-)
-viewDidLoad
のtextViewのトップコンテンツインセットを確認します。
NSLog(@"NSStringFromUIEdgeInsets(self.itemTextField.contentInset) = %@", NSStringFromUIEdgeInsets(self.itemTextField.contentInset));
ゼロでない場合、ストーリーボードでリセットします