Comment est-il possible que mon UITextView
modifiable (placé à l'intérieur d'un UIViewController simple à l'intérieur d'un UISplitView
qui agit comme délégué pour le UITextView
) n'affiche pas le texte depuis le début mais après quelque chose comme 6-7 lignes?
Je n'ai pas défini de mise en page automatique particulière ou quelque chose de similaire, essayer de supprimer du texte n'aide pas (donc pas de caractères cachés ou quelque chose).
J'utilise iOS 7 sur iPad, le storyboard a l'air bien ... Le problème est le même sur le simulateur iOS et les vrais appareils. Je deviens fou: P
Voici du code. Ceci est le 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
}
Et voici les fonctions remplacées pour le UITextView
J'utilise un code que j'ai trouvé sur StackOverflow pour simuler un espace réservé pour la vue (le même truc sur la version iPhone du storyboard fonctionne bien) ...
// 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;
}
Essayez d'appeler -sizeToFit
après avoir passé le texte. Cette réponse pourrait être utile pour Aligner verticalement le texte dans un UILabel .
[MISE À JOUR]
Je mets à jour cette réponse pour la rendre plus lisible.
. Cela se produit uniquement si la vue de défilement est la vue principale ou les premières sous-vues. Pour éviter cela, vous devez désactiver ce comportement en définissant automaticallyAdjustsScrollViewInsets
sur NO ou en remplaçant cette méthode pour renvoyer NO.
J'ai traversé le même genre de problème.
Résolu en désactivant le réglage automatique des incrustations de scrollView:
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")){
self.automaticallyAdjustsScrollViewInsets = NO; // Avoid the top UITextView space, iOS7 (~bug?)
}
Il s'agit d'un problème assez courant, je créerais donc une simple sous-classe UITextView, afin que vous puissiez la réutiliser et l'utiliser dans IB.
J'utiliserais le contentInset à la place, en veillant à gérer avec élégance le cas où le contentSize est plus grand que les limites du 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
utilisez -observerForKeyPath
avec contentSize
KeyPath
Regardez du code sur Mon Blog (ne vous concentrez pas sur la langue thaï )
http://www.macbaszii.com/2012/10/ios-dev-uitextview-vertical-alignment.html
Inspiré par Kiattisak, j'ai implémenté l'alignement vertical en tant que catégorie sur UITextView
afin que vous puissiez contrôler l'alignement vertical de l'héritage UITextView
.
Vous pouvez le trouver sous la forme d'un Gist here .
Version Swift de la réponse de Tanguy.G:
if(UIDevice.currentDevice().systemVersion >= "7.0") {
self.automaticallyAdjustsScrollViewInsets = false; // Avoid the top UITextView space, iOS7 (~bug?)
}
J'ai eu le même problème avec iOS 8.1, et aucune de ces suggestions n'a fonctionné.
Ce que a fait était d'aller dans le Storyboard et de faire glisser mon UITableView
ou UITextView
pour qu'il ne soit plus la première sous-vue du UIView
de mon écran.
http://www.codeproject.com/Tips/852308/Bug-in-XCode-Vertical-Gap-Above-UITableView
Il semble être lié à un UIView
intégré dans un UINavigationController
.
Punaise ? Punaise ? Ai-je dit "bug" ...?
;-)
Vérifiez l'encart de contenu supérieur de textView dans -viewDidLoad
:
NSLog(@"NSStringFromUIEdgeInsets(self.itemTextField.contentInset) = %@", NSStringFromUIEdgeInsets(self.itemTextField.contentInset));
Réinitialisez-le dans le storyboard s'il n'est pas nul