2013-03-19 16 views
5

Ho un UIScrollView aggiunto dinamicamente alla vista principale e lo sto riempiendo con piccoli oggetti UIView. Sto impostando il suo contenuto su qualcosa di più grande della risoluzione del dispositivo, ma non posso scorrerlo fino a quando non cambio l'orientamento del dispositivo.UIScrollView non scorre fino all'orientamento

Come posso farlo scorrere prima del cambio di orientamento?

modificare in seguito:

mi sono reso conto che il problema deriva da alcune subviews che sto aggiungendo, più precisamente dal l'aggiunta di alcuni vincoli per quei subviews:

Ecco il codice dove sto aggiungendo il subviews (il metodo viene chiamato circa 10-20 volte):

-(void) addShelve:(NSInteger) index 
{ 
FSShelf *shelf = [[FSShelf alloc] initWithFrame:CGRectMake(0, index * [FSConstants getShelfVerticalDistance], 0, 0)]; 
[shelves addObject:shelf]; 

[shelfView addSubview:shelf]; 
[shelf addShelfConstraints]; 
} 

FSShelf è una sottoclasse di UIView e shelfView è il mio sottoclasse di UIScrollView.

E qui sono i vincoli aggiunti al addShelfContraints:

[self.superview addConstraint:[FSUtils getWidthConstraintFor:self.superview with:self constant: -2 * ([FSConstants getShelveMargin])]]; 
    [self addConstraint:[FSUtils getSelfHeightConstraintFor:self constant:30]]; 
    [self.superview addConstraint:[FSUtils getCenterXConstraintFor:self.superview with:self constant:0]]; 

I metodi della classe FSUtils per l'aggiunta di vincoli:

+ (NSLayoutConstraint *)getSelfHeightConstraintFor:(UIView *)view constant:(CGFloat)constant 
{ 
    NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:view 
                    attribute:NSLayoutAttributeHeight 
                    relatedBy:NSLayoutRelationEqual 
                    toItem:nil 
                    attribute:NSLayoutAttributeNotAnAttribute 
                   multiplier:1.0 
                    constant:constant]; 
    return constraint; 
} 

+ (NSLayoutConstraint *)getCenterXConstraintFor:(UIView *)superView with:(UIView *)subView constant:(CGFloat)constant 
{ 
    NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:subView 
                    attribute:NSLayoutAttributeCenterX 
                    relatedBy:NSLayoutRelationEqual 
                    toItem:superView 
                    attribute:NSLayoutAttributeCenterX 
                   multiplier:1.0 
                    constant:constant]; 

    return constraint; 
} 

+ (NSLayoutConstraint *)getWidthConstraintFor:(UIView *)superView with:(UIView *)subView constant:(CGFloat)constant 
{ 
    NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:subView 
                    attribute:NSLayoutAttributeWidth 
                    relatedBy:NSLayoutRelationEqual 
                    toItem:superView 
                    attribute:NSLayoutAttributeWidth 
                   multiplier:1.0 
                    constant:constant]; 
    return constraint; 
} 

cosa si nota qualcosa di sbagliato con quei vincoli?

+2

Puoi fornirci qualche dettaglio in più sulla configurazione? Quando viene inizializzato UIScrollView? Il frame della vista di scorrimento è più piccolo del suo contentSize (prima della rotazione)? Il modo più semplice che posso immaginare per colpire il tuo bug è che la cornice della vista di scorrimento sia troppo grande. –

+0

Lo scrollView ha i vincoli per essere 100% larghezza e (100% - 50px altezza). Ho controllato la dimensione del contenuto e l'altezza è superiore a 2000 px. Sto inizializzando UIScrollView su un evento singleTap, quando sto sostituendo il contenuto della vista principale (rimuovendo uniview e aggiungendo la scrollview). Pubblicherò un po 'di codice più tardi oggi quando torno al progetto. – gabitzish

+0

per favore pubblica il tuo codice relativo al tuo UIScrollView. – Hiren

risposta

1

Sul singolo tocco, cercare di creare in questo modo

UIScrollView * scrollview = [[UIScrollView alloc]init]; 
CGRect viewFrame = self.view.frame; 
[scrollview setFrame:viewFrame]; 
[scrollview setShowsHorizontalScrollIndicator:YES]; 
[scrollview setShowsVerticalScrollIndicator:YES]; 

UIView * view = [[UIView alloc]init]; 
CGRect viewDoubleFrame = CGRectMake(viewFrame.origin.x,viewFrame.origin.y,viewFrame.size.width * 2,viewFrame.size.height *2); 
[view setFrame:viewDoubleFrame]; 
[view setBackgroundColor:[UIColor darkGrayColor]]; 

// add your additional components here 

[scrollview setContentSize:CGSizeMake(view.frame.size.width,view.frame.size.height)]; 
[scrollview addSubview:view]; 

[self.view addSubview:scrollview]; 
0

Fate attenzione che se si utilizza il layout automatico, semplicemente cambiando la dimensione del contenuto non è sufficiente. La Vista di scorrimento è strutturata in modo diverso. Ho trovato molto utile questa domanda sullo stack Here. Quindi controlla se stai usando il layout automatico e adattati ad esso o disattivalo.
Spero che questo aiuti, Andrea

[EDIT]
Se il target di dispositivi> = iOS6, perché non utilizzare le visualizzazioni di raccolta. Sono cose interessanti, con caratteristiche di layout sorprendenti e grazie a Peter hai una sostituzione in sostituzione di iOS> = 4.3. Per quello che ho capito potrebbero adattarsi alle tue esigenze. github

+0

Perché un voto negativo? – Andrea

1

Lo scorrimento non ha alcuna relazione con Risoluzione dispositivo. Scroll si verifica quando la dimensione del tuo contenuto è maggiore della dimensione del tuo frame ScrollView.

In generale per rendere possibile lo scorrimento di contenuti con dimensioni 100 * 100, è necessario avere una vista di scorrimento con dimensioni del fotogramma inferiori a 100 * 100. Se il frame.width < contentsize.width, consentirà lo scorrimento orizzontale. Allo stesso modo se frame.height < contentsize.height, consentirà lo scorrimento verticale.

È possibile che sia stato selezionato il layout automatico o che si possa aver utilizzato il ridimensionamento automatico dei contrassegni senza cura, il che potrebbe portare ad avere la dimensione di scrollview.frame maggiore del contenuto. Quando fornisci l'orientamento, la cornice può essere sistemata perfettamente e puoi scorrere.

Inviare il codice se si desidera individuare il problema esatto.

1

I vincoli che si sta tentando di inserire su shelfView (che presumo sia il tuo UIScrollView) non sono sensibili. Si stanno creando sottoview degli scaffali con zero larghezza e zero x origine FSShelf *shelf = [[FSShelf alloc] initWithFrame:CGRectMake(0, index * [FSConstants getShelfVerticalDistance], 0, 0)]; e quindi si tenta immediatamente di vincolare shelfView per avere la stessa larghezza zero meno qualche costante (quindi shelfView avrebbe bisogno di larghezza negativa) e quindi lo stesso centro x della sottoview, ma il la shelf view è ancora a larghezza zero e ha zero x origine! L'unico vincolo che stai assegnando alle sottoview degli scaffali è sulla loro altezza. In effetti, penso che manchi qualcosa qui. Con il codice che hai pubblicato, le sottoview degli scaffali hanno sempre larghezza zero. Vedete effettivamente qualcuno dei sottoview degli scaffali sullo schermo?

In ogni caso, ecco il mio consiglio: tentare di aggiungere vincoli a shelfView in base a ciascuna delle sue sottoview degli scaffali è una proposta perdente. In questo caso i vincoli sembrano non essere soddisfacenti, e in generale si scoprirà che i vari vincoli diventano insoddisfacenti a meno che non si sia molto attenti a garantire che tutte le sottoview siano sempre d'accordo su come esattamente dovrebbe essere il loro superview.

Invece di tutto questo, basta dimenticare il codice dei vincoli. Quello che stai cercando di fare è molto semplice. Si suppone che la shelfView abbia una cornice uguale alla dimensione dello schermo (o al frame dell'applicazione, ma probabilmente ai limiti della sua superview) e che le viste sugli scaffali debbano essere disposte verticalmente con alcuni margini verticali tra loro e alcuni margini orizzontali che separano li dal bordo dello schermo. Aggiungi le visualizzazioni come sei ora, ma invece di aggiungere eventuali vincoli chiama [self.view setNeedsLayout]; e quindi implementa il metodo viewDidLayoutSubviews nel tuo controller di visualizzazione. Ti consigliamo qualcosa di simile a:

- (void)viewDidLayoutSubviews { 
    const CGRect rootViewBounds = self.view.bounds; 
    shelfView.frame = rootViewBounds; 

    const CGFloat kHorizontalMargin = [FSConstants getShelveMargin]; 
    const CGFloat kVerticalDistancePerShelf = [FSConstants getShelfVerticalDistance]; 
    const CGFloat kShelfHeight = 30.0; 
    const NSUInteger shelvesCount = [shelves count]; 
    for (NSUInteger j = 0; j < shelvesCount; j++) { 
     UIView *shelf = [shelves objectAtIndex:j]; 
     shelf.frame = CGRectMake(kHorizontalMargin, 
           j * kVerticalDistancePerShelf, 
           CGRectGetWidth(rootViewBounds) - 2.0 * kHorizontalMargin, 
           kShelfHeight); 
    } 
    shelfView.contentSize = CGSizeMake(CGRectGetWidth(rootViewBounds), (shelvesCount - 1) * kVerticalDistancePerShelf + kShelfHeight); 
} 
Problemi correlati