Pergunta

Eu tenho um costume segue onde eu estou tentando fazer o inverso do padrão "Capa Vertical" segue de transição.Eu acho que isso deve funcionar:

UIView *srcView = ((UIViewController *)self.sourceViewController).view;
UIView *dstView = ((UIViewController *)self.destinationViewController).view;

[dstView setFrame:CGRectMake(0, 0, srcView.window.bounds.size.width, srcView.window.bounds.size.height)];

[srcView.window insertSubview:dstView belowSubview:srcView];

[UIView animateWithDuration:0.3
     animations:^{
         srcView.center = CGPointMake(srcView.center.x - srcView.frame.size.width, srcView.center.y);
     }
     completion:^(BOOL finished){
         [srcView removeFromSuperview];
     }
 ];

O problema é que o destino exibe em orientação retrato, mesmo que todos os outros visualizar no aplicativo é a orientação paisagem.Além disso, as coordenadas x e y são invertidos.Por que isso está acontecendo?

Eu montei shouldAutorotateToInterfaceOrientation em cada controlador de visualização, mas que não ajuda.Eu poderia rodar o vista com CGAffineTransformMakeRotation, mas que não parece ser a coisa certa a fazer;coordenadas seria ainda ser revertida, por uma coisa.

Atualização:

Eu tentei usar CGAffineTransformRotate para rodar o vista , mas parece ridículo.Mais de fundo mostra black.Eu não acho que esta é a maneira que é suposto para trabalhar.

Foi útil?

Solução 3

Aparentemente, era muito mais fácil do que eu pensei fazer o segue que eu queria.Aqui está o que funcionou:

- (void)perform {
    UIViewController *src = (UIViewController *)self.sourceViewController;
    [src dismissViewControllerAnimated:YES completion:^(void){ [src.view removeFromSuperview]; }];
}

Esperamos que isto ajude alguém.

Outras dicas

Desde que eu não era capaz de obter a orientação correta e de enquadramento da exibição de destino antes de os controladores de troca, eu fiz inverter o processo:

  1. salve a fonte de exibição, como uma imagem (ver Remover personalizado UIStoryboardSegue com animação personalizada ) ;
  2. mudar o controlador da corrente [presentViewController:...];
  3. em seguida, fazer a animação com a (correta) de destino de vista de incorporação, salvo a imagem de origem.

Aqui está o código completo :

#include <QuartzCore/QuartzCore.h>

@implementation HorizontalSwipingSegue

- (void) perform {
    UIViewController *source = self.sourceViewController;
    UIViewController *destination = self.destinationViewController;    
    UIView *sourceView = source.view;
    UIView *destinationView = destination.view;

    // Create a UIImageView with the contents of the source
    UIGraphicsBeginImageContext(sourceView.bounds.size);
    [sourceView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *sourceImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    UIImageView *sourceImageView = [[UIImageView alloc] initWithImage:sourceImage];

    [[self sourceViewController] presentViewController:[self destinationViewController] animated:NO completion:NULL];

    CGPoint destinationViewFinalCenter = CGPointMake(destinationView.center.x, destinationView.center.y);
    CGFloat deltaX = destinationView.frame.size.width;
    CGFloat deltaY = destinationView.frame.size.height;

    switch (((UIViewController *)self.sourceViewController).interfaceOrientation) {
       case UIDeviceOrientationPortrait:
            destinationView.center = CGPointMake(destinationView.center.x - deltaX, destinationView.center.y);                
            sourceImageView.center = CGPointMake(sourceImageView.center.x + deltaX, sourceImageView.center.y);
            break;
        case UIDeviceOrientationPortraitUpsideDown:
            destinationView.center = CGPointMake(destinationView.center.x + deltaX, destinationView.center.y);
            sourceImageView.center = CGPointMake(sourceImageView.center.x + deltaX, sourceImageView.center.y);
            break;
        case UIDeviceOrientationLandscapeLeft:
            destinationView.center = CGPointMake(destinationView.center.x, destinationView.center.y - deltaY);                
            sourceImageView.center = CGPointMake(sourceImageView.center.x + deltaY, sourceImageView.center.y);
            break;
        case UIDeviceOrientationLandscapeRight:
            destinationView.center = CGPointMake(destinationView.center.x, destinationView.center.y + deltaY);
            sourceImageView.center = CGPointMake(sourceImageView.center.x + deltaY, sourceImageView.center.y);
            break;
    }

    [destinationView addSubview:sourceImageView];

    [UIView animateWithDuration:0.6f
                     animations:^{
                         destinationView.center = destinationViewFinalCenter; 
                     }
                     completion:^(BOOL finished){
                         [sourceImageView removeFromSuperview];
                     }];
}

@end

ATUALIZADO RESPOSTA:

Certifique-se de que você está definindo o seu dstView do quadro corretamente.Eu acho que você vai ter melhor sorte com:

dstView.frame = srcView.frame;

em vez de:

[dstView setFrame:CGRectMake(0, 0, srcView.window.bounds.size.width, srcView.window.bounds.size.height)];

o bounds propriedade não reagir a mudanças na orientação da mesma forma frame não.

Substituir

[srcView insertSubview:dstView belowSubview:srcView];

com

[srcView insertSubview:dstView atIndex:0];

Se você está apenas adicionando outro modo de exibição do controlador em vista sua visão de hierarquia, que ver controlador não está indo para obter qualquer informação sobre a orientação do dispositivo, de modo que ele irá apresentar a vista em sua configuração padrão.Você precisa adicionar o controlador de visualização para o modo de exibição controlador de hierarquia, como também, utilizando os métodos de contenção descrito aqui.Você também precisará removê-lo a partir de uma hierarquia ao feito.

Existem também vários bons WWDC palestras sobre o assunto, a partir de 2011, chamado "a Implementação do controlador de visualização de contenção" e a partir deste ano, a evolução de vista controladores.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top