2011-02-22 4 views
2

Je suis un gars de longue date qui est assez nouveau pour le développement de l'iphone. Je trouve que de nombreux problèmes que je rencontre découlent de la réflexion sur les pages web, il est donc très possible que je ne pose pas les bonnes questions sur celui-ci. Néanmoins, après quelques heures à verser sur google results et stackoverflow pages, il est temps de jeter cette question dans le vide:iphone: écran partiel UIScrollView

Je suis en train de mettre en place une vue qui a des choses statiques/immuables tout en haut (par exemple, le titre du contenu ci-dessous), et permettre au reste de la "page" de défiler. Mon processus de pensée tel qu'il est maintenant est de créer une vue qui contient la partie statique, et un espace vide, puis d'ajouter en quelque sorte un scrollview à cet espace vide, mais c'est là que mes connaissances sont à sec.

code-sage, il cherche quelque chose comme ça (j'ai ajouté des commentaires pour montrer mon processus de pensée sur l'utilisation de ce code):

DetailsWrapper.m:

-(void)viewDidLoad { 

    //initialize details view (custom constructor that populates some stuff) 
    //ListingDetails is a subclass of UIViewController whose view is set to be a UIScrollView created in IB 
    //the viewDidLoad method of ListingDetails sets the contentSize of the scroll view 
    ListingDetails *details = [[ListingDetails alloc] initWithNibName:@"ListingDetails" andListingData:theListing]; 

    //create an empty view that takes up all but the top 45px of the iphone screen 
    CGRect scrollArea = CGRectMake(0.0f, 45.0f, 320.0f, 435.0f); 
    UIView *scrollView = [[UIView alloc] initWithFrame:scrollArea]; 

    //add the UIScrollView to the space we just made 
    [scrollView addSubview:details.view]; 

    //now show it 
    [self.view addSubview:scrollView]; 

    //cleanup 
    [scrollView release]; 
    [details release]; 
} 

Que tout fonctionne très bien et dandy, et tire le contenu correctement, avec le problème mineur que la vue de défilement ne fait pas ... défiler. Si j'essaie d'ajouter la vue ListingDetails normalement, sans utiliser cette enveloppe, le défilement fonctionne très bien, mais quelque chose que je fais (ou ne fais pas?) Ci-dessus fait que la fonctionnalité de défilement cesse d'être.

Est-ce que je pense à tout cela? L'objectif ultime est d'obtenir un écran où une partie défile et une partie ne le fait pas, donc si cela aide à ignorer tout ce que je viens de dire et à y répondre, allez-y.

Répondre

2

Tout d'abord, un seul UIViewController par écran. Période. À partir de là, vous voulez ajouter deux sous-vues à la vue principale de UIViewController (celle qui est chargée dans viewDidLoad). Pour mettre cela en termes de web, pensez à la vue du contrôleur de vue comme <body></body>.

En fin de compte, vous voudrez probablement quelque chose comme ça.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 45.0)]; 
    // Further configure your scroll view as you presumably already have in ListingDetails 
    [self.view addSubview:scrollView]; 
    [scrollView release]; 

    UIView *staticView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 45.0, 320.0, 435.0)]; 
    [self.view addSubview:staticView]; 
    [staticView release]; 
} 

Edit: La définition de cette dans Interface Builder

Selon vous le .h du contrôleur

@interface SampleViewController : UIViewController 
{ 
    UIScrollView *scrollView; 
    UIView *staticView; 
} 

@property (nonatomic, retain) IBOutlet UIScrollView *scrollView; 
@property (nonatomic, retain) IBOutlet UIView *staticView; 

@end 

et dans le fichier .m

@implementation SampleViewController 

@synthesize scrollView; 
@synthesize staticView; 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    self.scrollView = nil; 
    self.staticView = nil; 
} 

- (void)dealloc 
{ 
    [scrollView release], self.scrollView = nil; 
    [staticView release], self.staticView = nil; 
    [super dealloc]; 
} 

@end 

maintenant dans le Interface Builder fichier, vous pouvez faire un clic droit et faire glisser à partir du propriétaire du fichier (c'est votre sous-classe UIViewController) directement aux vues À l'écran. Lorsque vous relâchez une fenêtre apparaîtra et vous choisissez la propriété dans le code que vous souhaitez connecter à cette vue. Une fois que ceci est établi, vous pouvez référencer ces vues dans le code comme ceci.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Assume we need to make some tweaks once the view has loaded 
    self.staticView.backgroundColor = [UIColor redColor]; 
    self.scrollView.backgroundColor = [UIColor blackColor]; 
} 
+0

ahh ... vous avez fait * scrollView être un UIScrollView lui-même au lieu d'en avoir un comme sous-vue. Cela semble faire l'affaire. Maintenant, pour voir si je peux arrêter d'empiler les ViewControllers les uns sur les autres ... –

+0

Mise à jour de mon exemple avec une gestion de la mémoire appropriée. '-addSubview:' conserve ce qui est passé afin que nous puissions le libérer après l'avoir ajouté à la hiérarchie de vue. –

+0

newbie question connexe: en supposant que je crée les conceptions de scrollView et staticView dans IB sans classes de contrôleur pour aller avec eux, comment puis-je référencer ceux dans le code? –

0

Personnellement, je ne voudrais pas déranger avec l'instance scrollView, mais ne

[self.view addSubview:details.view]; 
details.view.frame = scrollArea; 

Mais je ne pense pas que ce soit votre problème. Un autre problème avec votre code est que votre contrôleur de vue ListingDetails est libéré à la fin de la méthode, laissant la vue sans contrôleur.

Fondamentalement, vous allez à ce sujet faux.Vous feriez mieux d'inclure tout votre code ListingDetails dans le contrôleur de vue en cours et d'ajouter votre UIScrollView dans Interface Builder. Les contrôleurs à vues multiples peuvent être empilés dans un UINavigationController ou un UITabBarController, mais à part cela, vous ne devriez en avoir qu'un UIViewController.