2013-04-18 2 views
8

Ich verwende autolayout, um die Höhe meines scrollview zu ändern. Ich füge etwas subviews dem scrollview hinzu, in dem ich die Inhaltsgröße manuell inkrementiere. Aber wenn ich ein Ereignis bekomme, bei dem ich die Höhe ändern möchte, ist die Inhaltsgröße gleich Null. HierUIScrollView contentsize wird bei Verwendung des automatischen Layouts auf Null zurückgesetzt

ist der Code:

-(void) addTag:(NSString *)tagName { 

    ... 
    [button addTarget:self action:@selector(tagPressed:) forControlEvents:UIControlEventTouchUpInside]; 
    [self setContentSize:CGSizeMake(self.frame.size.width, self.contentSize.height+60)]; 
    [self.items addObject: button]; 
    NSLog(@"content height: %0.2f", self.contentSize.height); 


} 

Konsolenausgabe:

2013-04-18 18:23:06.106 TouchSelectApp[19944:c07] content height: 120.00 

Here I Ausgang der content:

- (void)tagPressed:(UIButton *)sender { 

    NSLog(@"1 content height: %0.2f", self.contentSize.height); 
    ... 
} 

Die Konsole zeigt:

2013-04-18 18:17:24.747 TouchSelectApp[19944:c07] 1 content height: 0.00 

Ich weiß nicht, warum die Inhaltshöhe auf Null gesetzt. Hilf mir!

Update: Hier ist das Problem, das ich versuche zu lösen.

Ich habe eine Bildlaufansicht mit Tasten. Anfangs zeigt es nur einen Knopf. Wenn die Taste gedrückt wird, wird tagPressed: aufgerufen. Tag gedrückt ändert die Höhe, um alle Schaltflächen anzuzeigen. Wenn der Benutzer dann eine Schaltfläche auswählt, wird die Höhe der Bildlaufansicht auf das Original geändert und der Offset wird auf den Ursprung der Schaltfläche gesetzt. Der folgende Code funktioniert, aber die Animation ist alles falsch. Wenn ich den Offset und vor dem Animationsblock ändere, wird nur der Offset auf Null gesetzt.

- (void)tagPressed:(UIButton *)sender { 

    CGPoint p; 
    float maxHeight = self.items.count * 60; 


    if (self.height.constant == maxHeight) { 
     self.height.constant = 60; 
     p = CGPointMake(0, sender.frame.origin.y-5);  
    }else { 
     self.height.constant = maxHeight; 
     p = CGPointMake(0, 0); 
    } 

    [self.superview setNeedsUpdateConstraints]; 

    [UIView animateWithDuration:0.5f animations: ^{ 
      [self.superview layoutIfNeeded]; 
    } completion:^(BOOL finished) { 
      [self setContentOffset:p]; 

    }]; 

}

+0

Ich werde den Beitrag mit dem ursprünglichen Problem aktualisieren. –

+0

Ich sehe nicht, warum Sie überhaupt eine Bildlaufansicht benötigen. Sie haben eine Ansicht, die entweder eine Schaltfläche anzeigt oder alle Schaltflächen anzeigt. Wo ist das Scrollen? Verwenden Sie einfach eine Ansicht, die die Größe ändert. Noch besser, zeige und verstecke einfach nur die Tasten, wenn es nötig ist. – matt

+0

Beachten Sie, dass eine Bildlaufansicht so ist, dass der * Benutzer * blättern kann. * Sie * können scrollen (dh eine bestimmte Schaltfläche anzeigen), ohne eine Scroll-Ansicht. Wenn Sie also nur versuchen, würde ich vorschlagen, die Scroll-Ansicht zu vermeiden, die eine Menge Komplikationen hinzufügt, die Sie nicht benötigen (soweit wie ich es sagen kann). – matt

Antwort

10

Wenn Sie die automatische Layout mit einem UIScrollView verwenden, können Sie nicht setzen die contentSize Eigenschaft. Weitere Informationen finden Sie unter here (scrollen Sie nach unten zum Abschnitt UIScrollView).

+2

Ich versuche wirklich, den Inhalt Offset zu ändern. Wie kann ich das machen? –

+2

Sie können die ContentSize in ViewDidLayoutSubviews festlegen.Das funktioniert gut für mich mit Automatische Anordnung heißt - (void) viewDidLayoutSubviews { [_scrollView setContentSize: CGSizeMake (_scrollView.width * [_imageViews count], 0)]; } – Yasper

Verwandte Themen