iOS 7 UITextView wyrównanie pionowe

Jak to możliwe, że mój edytowalny UITextView (umieszczony wewnątrz prostego kontrolera UIViewController wewnątrz UISplitView, który działa jako delegat dla UITextView) nie pokazuje tekstu od początku, ale po czymś w rodzaju 6-7 linii?

Zrzut ekranu

Nie ustawiłem żadnego konkretnego autolayout lub coś podobnego, próba usunięcia tekstu nie pomaga(więc żadnych ukrytych znaków lub coś).

[7]}używam iOS 7 na iPadzie, w storyboard wygląda dobrze... Problem jest taki sam na iOS simulator i prawdziwe urządzenia. Zaczynam się wściekać: p Tu jest jakiś kod. To jest 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
}

A oto nadpisane funkcje dla UITextView używam kodu, który znalazłem w StackOverflow, aby symulować symbol zastępczy dla widoku(to samo w wersji na iPhone ' a działa dobrze)...

// 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;
}
Author: Napolux, 2013-10-19

8 answers

Spróbuj wywołać -sizeToFit po przekazaniu tekstu. Ta odpowiedź może być przydatna do wyrównania tekstu w pionie w UILabel .
[Aktualizacja]
Aktualizuję tę odpowiedź o uczynić ją bardziej czytelną.
Problem polega na tym, że z iOS7 Kontrolery widoku kontenera, takie jak UINavigationController lub UITabbarController, mogą zmieniać wkłady zawartości widoków przewijania (lub widoków, które z niego dziedziczą), aby uniknąć nakładania się zawartości. Dzieje się tak tylko wtedy, gdy widok przewijania jest głównym widokiem lub pierwszymi podglądami podrzędnymi. Na unikaj, aby wyłączyć to zachowanie, ustawiając automaticallyAdjustsScrollViewInsets Na NO, lub nadpisując tę metodę na return NO.

 34
Author: Andrea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:24

Przechodziłem przez ten sam problem.

Rozwiązałem to, wyłączając automatyczne dopasowanie wstawek przewijania:

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")){
    self.automaticallyAdjustsScrollViewInsets = NO; // Avoid the top UITextView space, iOS7 (~bug?)
}
 15
Author: Tanguy G.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-10 21:35:26

Jest to dość powszechny problem, więc stworzyłbym prostą podklasę UITextView, abyś mógł ją ponownie użyć i użyć w IB.

Użyłbym zamiast tego contentInset, upewniając się, że z gracją obsłuży sprawę, w której contentSize jest większy niż granice 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
 7
Author: Jeff Holliday,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-21 18:10:52

Użyj - observerForKeyPath z contentSize klawiaturą

Poszukaj jakiegoś kodu na moim blogu (nie skupiaj się na Thai Language)

Http://www.macbaszii.com/2012/10/ios-dev-uitextview-vertical-alignment.html

 4
Author: Kiattisak Anoochitarom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-26 07:51:17

Zainspirowany Kiattisakiem, zaimplementowałem wyrównanie pionowe jako kategorię nad UITextView, abyś mógł kontrolować wyrównanie pionoweW legacy UITextView.

Możesz znaleźć go jako gist tutaj.

 2
Author: Tom Susel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-26 08:20:01

Miałem ten sam problem z iOS 8.1 i żadna z tych sugestii nie zadziałała.

Cozrobił praca polegała na wejściu do storyboardu i przeciągnięciu mojego UITableView LUB UITextView, aby nie był już pierwszym podglądem mojego ekranu UIView.

Http://www.codeproject.com/Tips/852308/Bug-in-XCode-Vertical-Gap-Above-UITableView

Wydaje się być związane z posiadaniem UIView osadzonego w UINavigationController.

Bug ? Bug ? Powiedziałem "robal"...?

;-)

 1
Author: Mike Gledhill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-23 15:15:59

Szybka wersja Tanguy.Odpowiedź G:

if(UIDevice.currentDevice().systemVersion >= "7.0") {
            self.automaticallyAdjustsScrollViewInsets = false; // Avoid the top UITextView space, iOS7 (~bug?)
  }
 1
Author: Jitendra Kulkarni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-20 00:06:05

Sprawdzanie górnej wstawki zawartości textView w -viewDidLoad:

NSLog(@"NSStringFromUIEdgeInsets(self.itemTextField.contentInset) = %@", NSStringFromUIEdgeInsets(self.itemTextField.contentInset));

Zresetuj go w storyboardzie, jeśli nie jest zero

 0
Author: LorikMalorik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-19 17:15:16