Ich habe eine benutzerdefinierte UITableViewCell implementiert, die eine UITextView enthält, die automatisch die Größe ändert, wenn der Benutzer tippt, ähnlich wie das Feld "Notizen" in der Kontakte-App. Es funktioniert ordnungsgemäß auf meinem iPhone, aber wenn ich es in der iPad testen, bekomme ich einige sehr seltsames Verhalten: Wenn man das Ende einer Zeile erreicht, wird die Tastatur für eine Millisekunde ausgeblendet und dann sofort wieder angezeigt. Ich würde es als einen schrulligen Fehler abtun, aber es führt tatsächlich zu einem Datenverlust, denn wenn man tippt, gehen ein oder zwei Zeichen verloren. Hier ist mein Code:
Der Kodex
// returns the proper height/size for the UITextView based on the string it contains.
// If no string, it assumes a space so that it will always have one line.
- (CGSize)textViewSize:(UITextView*)textView {
float fudgeFactor = 16.0;
CGSize tallerSize = CGSizeMake(textView.frame.size.width-fudgeFactor, kMaxFieldHeight);
NSString *testString = @" ";
if ([textView.text length] > 0) {
testString = textView.text;
}
CGSize stringSize = [testString sizeWithFont:textView.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap];
return stringSize;
}
// based on the proper text view size, sets the UITextView's frame
- (void) setTextViewSize:(UITextView*)textView {
CGSize stringSize = [self textViewSize:textView];
if (stringSize.height != textView.frame.size.height) {
[textView setFrame:CGRectMake(textView.frame.origin.x,
textView.frame.origin.y,
textView.frame.size.width,
stringSize.height+10)]; // +10 to allow for the space above the text itself
}
}
// as per: https://stackoverflow.com/questions/3749746/uitextview-in-a-uitableviewcell-smooth-auto-resize
- (void)textViewDidChange:(UITextView *)textView {
[self setTextViewSize:textView]; // set proper text view size
UIView *contentView = textView.superview;
// (1) the padding above and below the UITextView should each be 6px, so UITextView's
// height + 12 should equal the height of the UITableViewCell
// (2) if they are not equal, then update the height of the UITableViewCell
if ((textView.frame.size.height + 12.0f) != contentView.frame.size.height) {
[myTableView beginUpdates];
[myTableView endUpdates];
[contentView setFrame:CGRectMake(0,
0,
contentView.frame.size.width,
(textView.frame.size.height+12.0f))];
}
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
int height;
UITextView *textView = myTextView;
[self setTextViewSize:textView];
height = textView.frame.size.height + 12;
if (height < 44) { // minimum height of 44
height = 44;
[textView setFrame:CGRectMake(textView.frame.origin.x,
textView.frame.origin.y,
textView.frame.size.width,
44-12)];
}
return (CGFloat)height;
}
Die Probleme
So sieht es also aus
- Dieser Code funktioniert auf meinem iPhone und im iPhone-Simulator zu 100 % korrekt. Wie ich den Text eingeben, die UITextView wächst reibungslos, und die UITableViewCell zusammen mit ihm.
- Auf dem iPad-Simulator wird es jedoch schwierig. Es funktioniert gut, während man in der ersten Zeile tippt, aber wenn man zum Ende einer Zeile kommt, verschwindet die Tastatur und erscheint dann sofort wieder, so dass die App ein oder zwei Zeichen verpasst, wenn der Benutzer weiter tippt.
- Hier sind einige zusätzliche Anmerkungen zu den merkwürdigen Verhaltensweisen, die mir aufgefallen sind und die vielleicht zur Erklärung beitragen:
- Außerdem habe ich festgestellt, dass das Entfernen der Linien
[myTableView beginUpdates]; [myTableView endUpdates];
in der FunktiontextViewDidChange:(UITextView *)textView
lässt die UITextView richtig wachsen und blendet auch die Tastatur nicht ein und aus, aber leider wächst dann die UITableViewCell nicht auf die richtige Höhe. - UPDATE Unter diese Anleitungen Jetzt kann ich die seltsame Bewegung des Textes stoppen, aber die Tastatur wird immer noch ein- und ausgeblendet, was sehr seltsam ist.
- Außerdem habe ich festgestellt, dass das Entfernen der Linien
Hat jemand eine Idee, wie man die Tastatur kontinuierlich einblenden kann, anstatt sie aus- und wieder einzublenden, wenn man das Ende der Zeile auf dem iPad erreicht?
P.S.: Ich bin nicht an der Nutzung von ThreeTwenty interessiert.