UIScrollView Inhalte Abstände nicht arbeiten für Tastatur Höhe
Ich versuche eine UIScrollView
wenn die Tastatur verbirgt sich ein UITextField
durch das ändern der Größe mithilfe der contentInsets
wie es gezeigt wird.
Jedoch, das es nicht für die Tastatur Höhe. Die Tastatur Höhe kommt wie 216, aber es hält scrollen an die richtige Stelle wenn ich den unteren Rand, 515 für iPhone portrait-Modus und 310 für iPhone landscape-Modus. Warum würde diese Dimensionen so anders sein? Ich will nicht hartcodieren diese willkürliche Werte.
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.frame = self.parentViewController.view.frame;
[self.textView becomeFirstResponder];
NSLog(@"scrollview: %f,%f, parent: %f,%f", self.view.frame.size.height, self.view.frame.size.width, self.parentViewController.view.frame.size.height, self.parentViewController.view.frame.size.width);
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWasShown:)
name:UIKeyboardDidShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
}
- (void)keyboardWasShown:(NSNotification *)notification
{
if([[UIDevice currentDevice]userInterfaceIdiom]==UIUserInterfaceIdiomPhone) {
//Step 1: Get the size of the keyboard.
CGFloat keyboardHeight = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size.height;
//Step 2: Adjust the bottom content inset of your scroll view by the keyboard height.
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardHeight, 0.0);
((UIScrollView*)self.view).contentInset = contentInsets;
((UIScrollView*)self.view).scrollIndicatorInsets = contentInsets;
//Step 3: Scroll the target text field into view.
CGRect aRect = self.view.frame;
aRect.size.height = aRect.size.height - keyboardHeight;
if (!CGRectContainsPoint(aRect, self.textView.frame.origin) ) {
CGPoint scrollPoint = CGPointMake(0.0, self.textView.frame.origin.y - keyboardHeight);
[((UIScrollView*)self.view) setContentOffset:scrollPoint animated:YES];
}
}
}
- (void) keyboardWillHide:(NSNotification *)notification {
UIEdgeInsets contentInsets = UIEdgeInsetsZero;
((UIScrollView*)self.view).contentInset = contentInsets;
((UIScrollView*)self.view).scrollIndicatorInsets = contentInsets;
}
Edit:
Bevor die Tastatur geöffnet ist, Drucke ich diese aus:
NSLog(@"scrollview: %f,%f, parent: %f,%f", self.view.frame.size.height, self.view.frame.size.width, self.parentViewController.view.frame.size.height, self.parentViewController.view.frame.size.width);
und es gibt diese:
scrollview: 431.000000,320.000000, parent: 431.000000,320.000000
- ist ist das scrollen gut ohne Tastatur, könnte es möglich sein, die Sie gegeben haben, die Höhe größer als die Höhe der übergeordneten Ansicht.
- Yep. Es ist fein scrolling
- ich möchte wissen, ist der Rahmen der scrollview und übergeordneten Ansicht-Rahmen vor dem öffnen der Tastatur.
- Das UIScrollView ist innerhalb eines UITabBarController. Bitte siehe meine edits.
- im code selbst.Ansicht Art der scrollview?
- Ja. [self.Ansicht isKindOfClass:[UIScrollView class]]; gibt JA
- kannst du den code, weil von hier aus alles scheint in Ordnung zu sein.
- Ich habe alle relevanten code aus der ViewController.
- schreiben Sie diese zwei Zeilen selbst.Blick.frame = self.parentViewController.Blick.Rahmen; [self.textView becomeFirstResponder];in viewDidAppear statt ViewDidLoad
- Das schien nicht zu arbeiten.
- Kristin werfen Sie einen Blick auf
UIScrollView
'scontentSize
Eigenschaft. WenncontentSize.height
ist nicht groß genug, änderncontentInsets
allein könnte nicht genug sein. Das heißt, das hinzufügen / entfernen der Tastatur die Höhe der scrollview istcontentSize.height
- Ich fügte hinzu, sv.contentSize = CGSizeMake(sv.contentSize.Breite, sv.contentSize.Höhe - keyboardHeight); (wo sv ist der uiscrollview) und es funktioniert immer noch nicht 🙁
- Ich habe auch Probleme mit UIScrollView und content-Einsätze und ich fand heraus, dass es ist mit auto-layout". Wenn ich deaktivieren Sie "auto-layout" in der xib-Datei, verschwindet das problem. Ich weiß nicht mehr, in dieser Zeit, aber vielleicht hilft es, finden Sie die Quelle des Problems.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass das Hauptproblem ist, dass Sie brauchen, um zu verwenden
UIKeyboardFrameEndUserInfoKey
stattUIKeyboardFrameBeginUserInfoKey
.Dass gesagt wird, ich habe geschrieben eine andere version dieser Methode, die funktionieren, auch wenn der scrollview ist nicht platziert am unteren Rand des Bildschirms und können besser für Sie arbeiten:
Hinweis, dass ich
self.activeTextField
stattself.textField
.contentInset
aus der code sehr viel einfacher.legen Sie delegieren Ihre scrollView als sich selbst, egal wo Sie sind, um scrollview in Ihrem code
dann
Nun eingestellt delegieren von Ihr Textfeld. Wenn textFieldShouldBeginEditing: Ihre scrollview automatisch sich, die. scrollViewToCenterOfScreen: die Methode set Ihre scrollview position bei textfiled position.
Es definitiv Ihre scrollview-content-Einsätze sowie setContentOffset. Bitte lassen Sie mich wissen, wenn Sie noch mit diesem problem konfrontiert. Dank