2012-06-06 9 views
5

Ich habe ein UIScrollView, das mehrere dynamische Ansichten darin hat, von denen jedes ein Textfeld hat. Wenn ich mit der Eingabe eines der Felder beginne, möchte ich, dass die Bildlaufansicht so weit geblättert wird, dass das Feld oben auf dem Bildschirm angezeigt wird (über der Tastatur sichtbar). Es funktioniert großartig; hier ist der Code:Scrollen eines UIScrollView, um das niedrigste von mehreren Textfeldern anzuzeigen

(void)didStartTyping:(id)sender { 
    [scrollView setContentOffset:CGPointMake(0, subView.frame.origin.y) animated:YES]; 
    scrollView.scrollEnabled = NO; 
} 

(void)didFinishTyping:(id)sender { 
    scrollView.scrollEnabled = YES; 
} 

Aber immer dann, wenn die Scroll-Ansicht wird nach ganz oben gescrollt und ich beginne die Eingabe in dem untersten sichtbaren Textfeld navigieren Sie nicht weit genug nach unten (kurz um etwa 40 px). Das Rätselhafte ist, dass es funktioniert, wenn ich nur einen Pixel vom oberen Rand der Bildlaufansicht nach unten scrolle, aber wenn ich nach oben scrolle, verhält es sich ganz anders.

+1

Sie müssen sich einloggen um die Rahmen von scollview sowohl das Szenario verwenden und überprüfen, was ist da? Was ich mir vorstellen kann ist, dass der untere Offset erhöht werden muss. – rishi

+0

Nun, das hätte Sinn gemacht. Vorläufig bestand das hässliche Problem darin, die Unteransichten so zu skalieren, dass das Textfeld der unteren Ansicht nicht ganz zu sehen ist, wenn die Ansicht nach oben gescrollt wird. Nicht optimal, aber es funktioniert jetzt, und wenn ich noch einmal darauf zurück komme, werde ich dich wissen lassen, wie es läuft. Danke Rishi. – Gazzini

+1

Kann die Bildlaufansicht manuell zur gewünschten Position blättern - dh, geben Sie nicht den Fokus im Textfeld an, sondern ziehen Sie die Bildlaufansicht an die gewünschte Stelle, wenn die Tastatur angezeigt werden soll. Kannst du es dorthin ziehen, wo du es haben willst? Wenn die Inhaltsgröße der Bildlaufansicht den Inhalt fest umschließt, können Sie das letzte Objekt normalerweise nicht ganz nach oben bringen. Eine andere Möglichkeit, dies zu sagen, ist, können Sie versuchen, die Höhe Ihrer Inhaltsgröße viel größer als den Inhalt festzulegen. – danh

Antwort

2

Der beste Weg, ich habe es geschafft, ist es, den Tastaturrahmen zu greifen, dann meine scrollview-Einsätze zu aktualisieren, wenn eine Textansicht ruft TextViewDidBeginEditing: aufgerufen. Hier wird eine Tabellenansicht verwendet, aber die gleiche Logik sollte für eine Scrollansicht gelten, wobei der Hauptunterschied darin besteht, wie Sie blättern. Ich benutze scrollToRowAtIndexPath, werden Sie scrollRectToVisible

//setup keyboard callbacks 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow:) 
               name:UIKeyboardWillShowNotification 
               object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow:) 
               name:UIKeyboardWillHideNotification 
               object:nil]; 
} 

- (void)keyboardWillShow:(NSNotification*)aNotification 
{ 
    NSDictionary* info = [aNotification userInfo]; 
    kbFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; 
} 

//this is called from your UITextViewDelegate when textViewDidBeginEditing: is called 
- (void)updateActiveTextScroll:(UITextView*)textView 
{ 
    activeTextView = textView; 
    UIEdgeInsets inset; 
    UIInterfaceOrientation orient = [[UIApplication sharedApplication] statusBarOrientation]; 
    if(UIInterfaceOrientationIsLandscape(orient)) 
    { 
     inset = UIEdgeInsetsMake(0.0, 0.0, kbFrame.size.width, 0.0); 
    } 
    else 
    { 
     inset = UIEdgeInsetsMake(0.0, 0.0, kbFrame.size.height, 0.0); 
    } 
    myTableView.contentInset = inset; 
    myTableView.scrollIndicatorInsets = inset; 

    [myTableView scrollToRowAtIndexPath:activeNSIndexPath 
         atScrollPosition:UITableViewScrollPositionBottom 
           animated:YES]; 
} 

//dont forget to reset when the keyboard goes away 
- (void)keyboardWillBeHidden:(NSNotification*)aNotification 
{ 
    UIEdgeInsets inset = UIEdgeInsetsZero; 
    myTableView.contentInset = inset; 
    myTableView.scrollIndicatorInsets = inset; 
} 
Verwandte Themen