2012-10-07 11 views
9

Ich implementiere ein Formular in einem UIScrollView. Ich versuche, am unteren Rand des Inhalts einer Bildlaufansicht etwas Platz zu schaffen, wenn die Tastatur geöffnet wird, damit der Benutzer alle Felder sehen kann. Ich habe die Formularansicht in der UISCrollView Hinzufügen alle notwendigen Einschränkungen, die mit dem folgenden Code:iOS: Ändern der Inhaltsgröße eines UIScrollview mit Auto-Layout

[_infoView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_infoView(1730)]" options:0 metrics:nil views:views]]; 

[_scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_infoView]|" options:0 metrics:nil views:views]]; 

[_scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_infoView]|" options:0 metrics:nil views:views]]; 

[_scrollView addConstraint:[NSLayoutConstraint constraintWithItem:_infoView 
                 attribute:NSLayoutAttributeCenterX 
                 relatedBy:NSLayoutRelationEqual 
                  toItem:_scrollView 
                 attribute:NSLayoutAttributeCenterX 
                 multiplier:1 
                 constant:0]]; 

Wie Sie sehen können, habe ich in der ersten Zeile geben Sie die Höhe des Formulars und der scrollview passt seine Inhalte automatisch Größe. Jetzt möchte ich die Höhe des Formulars erhöhen, also habe ich versucht, die Beschränkung für die Höhe mit einem größeren zurückzusetzen, aber es wird nicht funktionieren. Dann habe ich versucht, die [_scrollView setContentSize:] Methode zu verwenden, aber das wird auch nicht funktionieren. Kann mir bitte jemand helfen?

+0

Haben Sie das jemals herausgefunden? Ich habe eine schreckliche Zeit, das herauszufinden. – mkral

Antwort

-2

Ich bin nicht sicher, wo Sie den obigen Code hinzufügen, aber die unten Ihr Problem

in Ihrer init-Funktion lösen, fügen Sie die folgenden:

NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; 
     [center addObserver:self selector:@selector(noticeShowKeyboard:) name:UIKeyboardDidShowNotification object:nil]; 
     [center addObserver:self selector:@selector(noticeHideKeyboard:) name:UIKeyboardWillHideNotification object:nil]; 

In der unten an deine .h

CGSize keyboardSize; 
int keyboardHidden;  // 0 @ initialization, 1 if shown, 2 if hidden 

Fügen Sie die unten an .m

-(void) noticeShowKeyboard:(NSNotification *)inNotification { 
    keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 
    keyboardHidden = 1; 
    [self layoutSubviews];  // Not sure if it is called automatically, so I called it 


} 
-(void) noticeHideKeyboard:(NSNotification *)inNotification { 
    keyboardHidden = 2; 
    [self layoutSubviews];  // Not sure if it is called automatically, so I called it 

} 

- (void) layoutSubviews 
{ 
    [super layoutSubviews]; 

    if(keyboardHidden == 1) { 
     scrollview.frame = CGRectMake(scrollview.frame.origin.x, scrollview.frame.origin.y, scrollview.frame.size.width, scrollview.frame.size.height + keyboardSize.height); 
    } 
    else if(keyboardHidden == 2) { 
     scrollview.frame = CGRectMake(scrollview.frame.origin.x, scrollview.frame.origin.y, scrollview.frame.size.width, scrollview.frame.size.height - keyboardSize.height); 
    } 
} 

Ich überholte layoutsubviews, jetzt denke ich, dass es funktionieren sollte.

+0

Das Problem ist, dass, wenn Ihre Feder Auto-Layout verwendet, rect-Größen von Constraints verwaltet werden und sie direkt eingestellt werden – mastergap

+1

Überprüfen Sie die bearbeitete Antwort, überschreiben 'layoutsubviews' sollte Ihr Problem lösen ... – MuhammadBassio

4

Wenn ich das Problem verstehe, würde ich empfehlen, die contentInset Eigenschaft auf der UIScrollView anstatt layoutSubviews Anruf layoutSubviews. Beachten Sie, dass die Dokumentation lautet:

Verwenden Sie diese Eigenschaft, um den Bildlaufbereich um Ihren Inhalt hinzuzufügen. Die Einheit der Größe ist Punkte. Der Standardwert ist UIEdgeInsetsZero.

Sie haben noch für die Tastatur hide/show-Benachrichtigungen zu hören, um zu wissen, wann die Höhe des Scroll anzupassen:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; 

Dann in keyboardWillShow Sie dies tun können:

UIEdgeInsets insets = UIEdgeInsetsMake(0, 0, 100, 0); 
scrollView.contentInset = insets; 

100 ist die Höhe, um die Sie Ihre scrollView anpassen möchten. Ich mache das mit einer UITableView, in der ich Formelemente wie UITableViewCell s habe und es funktioniert gut.

Verwandte Themen