4 votes

Taille du contenu de l'UIScrollview en cas de changement d'orientation

J'ai un scrollview avec pagination. Dans viewDidLoad, je vérifie si l'orientation actuelle est paysage, puis je fixe la hauteur de son contentsize à 440.

 if (UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation])) 
    {
        [scroll      setContentSize:CGSizeMake(self.scroll.frame.size.width*numberOfPages,340)];

    }
    else if (UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation]))

    {
        [scroll setFrame:CGRectMake(0,0,480,480)];
        [scroll setContentSize:CGSizeMake(self.scroll.frame.size.width*numberOfPages, 440)];

    }

tout fonctionne bien, le scrollview défile de manière fluide et il n'y a pas de défilement diagonal.

mais quand l'orientation change,

Je dois à nouveau définir le cadre et la taille du contenu du scrollview et je les définis comme suit

-(void)orientationChanged:(id)object
{
if(UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation]))
{
    self.scroll.frame = [[UIScreen mainScreen]bounds];

    [scroll setContentSize:CGSizeMake(self.scroll.frame.size.width*numberOfPages, 340)];
}

else
{
 self.scroll.frame = CGRectMake(0,0,480,480);
        [scroll setContentSize:CGSizeMake(self.scroll.frame.size.width*numberOfPages, 600)];
}

}

Je ne comprends pas pourquoi je dois régler la hauteur de la taille du contenu jusqu'à 600 en mode paysage, et cela ne suffit pas non plus. Et cela ajoute un problème supplémentaire : le scrollview commence à défiler en diagonale, ce que je ne veux pas car cela semble bizarre. Quelqu'un peut-il m'aider à comprendre où et ce qui me manque ?

J'ai défini le masque de redimensionnement automatique du scrollview en tant que

[scroll setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleHeight];

mais le changer n'aide pas.

5voto

Warif Akhand Rishi Points 3407
  1. N'utilisez pas UIDeviceOrientation . Utilisez UIInterfaceOrientation à la place. DeviceOrientation a deux options supplémentaires dont vous n'avez pas besoin ici. ( UIDeviceOrientationFaceUp y UIDeviceOrientationFaceDown )

  2. Retourner à Yes de shouldAutorotateToInterfaceOrientation

  3. Maintenant willRotateToInterfaceOrientation: duration: sera appelé chaque fois que vous ferez pivoter votre appareil.

  4. Mettez en œuvre cette méthode comme suit.

    -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
    {
    CGRect frame;
    int pageNumber = 2;
    int statusBarHeight = 20;
    
    if ((toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) || (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)) {
        frame = CGRectMake(0, 0, 480, 320 - statusBarHeight);
    } else {
        frame = CGRectMake(0, 0, 320, 480 - statusBarHeight);
    }
    
    scrollView.frame = frame;
    scrollView.contentSize = CGSizeMake(frame.size.width * 2, frame.size.height);
    } 

    Laissez,

    numéro de page = 2

    statusBarHeight = 20

2voto

Dinesh Raja Points 3509

Ici, il s'agit d'un problème dans votre code. Pourquoi définissez-vous la taille de l'image comme ça ? Vous avez seulement la taille de l'écran de 320px width . Et quand il devient landscape la hauteur sera de seulement 320px . Mais vous réglez le défilement height comme 480px et il goes out of the screen y start to scroll diagonally .

self.scroll.frame = CGRectMake(0,0,480,480);

Au lieu de cette taille de cadre, changez comme suit

self.scroll.frame = CGRectMake(0,0,480,320);

Et vous devez définir le taille du contenu dépendent de la contenu que vous avez à l'intérieur du la vue défilante dans l'une ou l'autre orientation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X