2011-02-08 3 views
1

Hey. Je l'ai réalisé faire un UIScrollView programmatique avec le zoom, mais maintenant j'ai essayé de prendre l'image scrollable/zoomable à un écran externe si branché.Défilement UIScrollView sur l'écran externe attaché à un iPad

@implementation MapVC 

UIScrollView *mapScrollView; 

UIImageView *mapImageView; 

UIImageView *mapImageViewEx; 

CGFloat lastScale = 0; 

NSMutableArray *map_List; 


- (id)initWithFrame:(CGRect)frame { 

    self = [super initWithFrame:frame]; 
    if (self) { 

     mainMenuAppDelegate *del = (mainMenuAppDelegate *)[[UIApplication sharedApplication] delegate]; 

     map_List = [[NSMutableArray alloc] init]; 
     [map_List addObject:@"Pacific_Map.png"]; 
     [map_List addObject:@"Atlantic_Map.png"]; 


     CGRect mapScrollViewFrame = CGRectMake(0, 0, 1024, 768); 

     mapScrollView = [[UIScrollView alloc] initWithFrame:mapScrollViewFrame]; 

     mapScrollView.backgroundColor = [UIColor blackColor]; 

     [mapScrollView setDelegate:(id<UIScrollViewDelegate>)self]; 

     mapScrollView.contentSize = CGSizeMake(2437, 1536); 

     mapScrollView.bounces = NO; 

     mapScrollView.bouncesZoom = NO; 

     mapScrollView.minimumZoomScale = .5; 

     mapScrollView.maximumZoomScale = 1.5; 

     [mapScrollView setZoomScale:mapScrollView.minimumZoomScale]; 

     UIImage *mapImage = [UIImage imageNamed:[map_List objectAtIndex:mapNum]]; 
     mapImageView = [[UIImageView alloc] initWithImage: mapImage]; 
     [mapImage release]; 

     if(exScreenEnabled==1){ 
      UIImage *mapImageEx = [UIImage imageNamed:[map_List objectAtIndex:mapNum]]; 
      mapImageViewEx = [[UIImageView alloc] initWithImage: mapImageEx]; 
      [mapImageEx release]; 

      UIView *containerExViewP = (UIView*)[del.switchExVC.view viewWithTag:9000]; 
      [containerExViewP addSubview:mapImageViewEx]; 
     }else{ 
      [mapScrollView addSubview:mapImageView]; 
     } 



     [self addSubview:mapScrollView]; 

     mapImageView.userInteractionEnabled = YES; 



     UIImage *footerMapIMG = [UIImage imageNamed:@"footer_map_alternate.png"]; 
     UIImageView *footerMapView = [[UIImageView alloc] initWithImage:(UIImage *)footerMapIMG]; 
     CGRect footerMapFrame = CGRectMake(0, 686, 213, 82); 
     footerMapView.frame = footerMapFrame; 
     [self addSubview:footerMapView]; 
     footerMapView.image = footerMapIMG; 

     [footerMapView release]; 


     CGRect backBTNFrame = CGRectMake(20, 714, 140, 52); 
     UIButton *MAP_backButton = [[UIButton alloc] init]; 
     MAP_backButton.frame = backBTNFrame; 
     UIImage *MAP_backButtonIMG = [UIImage imageNamed:@"button_back.png"]; 
     [MAP_backButton setImage:MAP_backButtonIMG forState:UIControlStateNormal]; 
     MAP_backButton.backgroundColor = [UIColor clearColor]; 
     [self addSubview:MAP_backButton]; 

     [MAP_backButton release]; 


     [MAP_backButton addTarget:del.switchVC 
          action:@selector(gotoMapAndListChooser) 
         forControlEvents:UIControlEventTouchUpInside]; 
    } 
    return self; 
} 
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{ 
    if(exScreenEnabled==1){ 
     return mapImageViewEx; 
    }else{ 
     return mapImageView; 
    } 
} 

(Désolé, j'ai eu aucune chance pour que formaté pour regarder à droite sur ce site)

Si un câble vidéo est branché sur un iPad, il n'y a pas d'image sur l'iPad, ce que je veux. L'image sur l'écran externe effectue un zoom correct lorsque vous faites le geste sur l'iPad, mais je n'arrive pas à comprendre comment le faire défiler. Merci d'avance.

edit: J'ai maintenant ce -

@implementation MapVC 

UIScrollView *mapScrollView; 

UIImageView *mapImageView; 
UIImageView *mapImageViewEx; 

CGFloat lastScale = 0; 

NSMutableArray *map_List; 

int touchesNum = 0; 

-(void)touchesBegan:(NSSet *)theTouches withEvent:(UIEvent *)event { 
    NSSet *touches = [event allTouches]; 
    touchesNum=[touches count]; 
    NSLog(@"number of touches %i", touchesNum); 
} 


- (id)initWithFrame:(CGRect)frame { 

    self = [super initWithFrame:frame]; 
    if (self) { 



     mainMenuAppDelegate *del = (mainMenuAppDelegate *)[[UIApplication sharedApplication] delegate]; 

     map_List = [[NSMutableArray alloc] init]; 
     [map_List addObject:@"Pacific_Map.png"]; 
     [map_List addObject:@"Atlantic_Map.png"]; 


     CGRect mapScrollViewFrame = CGRectMake(0, 0, 1024, 768); 

     mapScrollView = [[UIScrollView alloc] initWithFrame:mapScrollViewFrame]; 

     mapScrollView.backgroundColor = [UIColor blackColor]; 

     [mapScrollView setDelegate:(id<UIScrollViewDelegate>)self]; 

     mapScrollView.contentSize = CGSizeMake(2437, 1536); 

     mapScrollView.bounces = NO; 

     mapScrollView.bouncesZoom = NO; 

     mapScrollView.minimumZoomScale = .5; 

     mapScrollView.maximumZoomScale = 1.5; 

     [mapScrollView setZoomScale:mapScrollView.minimumZoomScale]; 

     UIImage *mapImage = [UIImage imageNamed:[map_List objectAtIndex:mapNum]]; 
     mapImageView = [[UIImageView alloc] initWithImage: mapImage]; 
     [mapImage release]; 

     if(exScreenEnabled==1){ 
      UIImage *mapImageEx = [UIImage imageNamed:[map_List objectAtIndex:mapNum]]; 
      mapImageViewEx = [[UIImageView alloc] initWithImage: mapImageEx]; 
      [mapImageEx release]; 

      UIView *containerExViewP = (UIView*)[del.switchExVC.view viewWithTag:9000]; 
      [containerExViewP addSubview:mapImageViewEx]; 
     }else{ 
      [mapScrollView addSubview:mapImageView]; 
     } 



     [self addSubview:mapScrollView]; 

     mapImageView.userInteractionEnabled = YES; 



     UIImage *footerMapIMG = [UIImage imageNamed:@"footer_map_alternate.png"]; 
     UIImageView *footerMapView = [[UIImageView alloc] initWithImage:(UIImage *)footerMapIMG]; 
     CGRect footerMapFrame = CGRectMake(0, 686, 213, 82); 
     footerMapView.frame = footerMapFrame; 
     [self addSubview:footerMapView]; 
     footerMapView.image = footerMapIMG; 

     [footerMapView release]; 


     CGRect backBTNFrame = CGRectMake(20, 714, 140, 52); 
     UIButton *MAP_backButton = [[UIButton alloc] init]; 
     MAP_backButton.frame = backBTNFrame; 
     UIImage *MAP_backButtonIMG = [UIImage imageNamed:@"button_back.png"]; 
     [MAP_backButton setImage:MAP_backButtonIMG forState:UIControlStateNormal]; 
     MAP_backButton.backgroundColor = [UIColor clearColor]; 
     [self addSubview:MAP_backButton]; 

     [MAP_backButton release]; 


     [MAP_backButton addTarget:del.switchVC 
          action:@selector(gotoMapAndListChooser) 
         forControlEvents:UIControlEventTouchUpInside]; 

     mapScrollView.multipleTouchEnabled = YES; 
    } 
    return self; 
} 


- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{ 
    if(exScreenEnabled==1){ 
     return mapImageViewEx; 
    }else{ 
     return mapImageView; 
    } 
} 

- (void)scrollViewDidScroll:(UIScrollView *)inscrollView{ 
    if(touchesNum==0){ 
     CGPoint p = mapScrollView.contentOffset; 
     mapImageViewEx.frame = CGRectMake((p.x*-1), (p.y*-1), mapImageViewEx.frame.size.width, mapImageViewEx.frame.size.height); 
    } 
} 



- (void)dealloc { 

    [mapScrollView release]; 
    [mapImageView release]; 

    [map_List release]; 


    [super dealloc]; 
} 

@end 

Comme je l'ai dit ci-dessous, je peux maintenant obtenir si le défilement fonctionne, soit défilement ou le zoom à travailler séparément, mais le zoom est tout foiré parce que quand zoomer pense qu'il fait aussi défiler. Donc, je veux éviter de faire défiler en zoomant, et pour ce faire, je veux détecter le nombre de touches, que je dois faire mal!

+0

Hmm Je pourrais avoir un peu de chance en utilisant le décalage de contenu http://forums.macrumors.com/showthread.php?t=568315 et en réglant ces coordonnées sur l'image de l'autre écran. – VagueExplanation

+0

Je vais devoir le faire défiler maintenant avec scrollViewDidScroll et passer les coordonnées à l'écran externe. Le problème est que je ne peux pas faire fonctionner à la fois le zoom et le scroll en même temps, car cela entraînera des problèmes de zoom. Une solution à laquelle je pensais était de détecter le nombre de contacts qui se produisaient, mais les contacts commencés ne montrent même rien dans NSLog..grr – VagueExplanation

Répondre

1

Vous avez travaillé avec l'image sur l'iPad et l'écran externe. Je vais probablement l'échanger avec une zone rectangulaire parce que l'image est lourd de ressources pour être à la fois l'iPad et l'écran externe.

#import "exGlobal.h" 

#import "mapVC.h" 

#import "switchVC.h" 
#import "switchExVC.h" 
#import "mainMenuAppDelegate.h" 


#import <MobileCoreServices/MobileCoreServices.h> 

@implementation MapVC 

UIScrollView *mapScrollView; 

UIImageView *mapImageView; 
UIImageView *mapImageViewEx; 

CGFloat lastScale = 0; 

NSMutableArray *map_List; 

static int toggleScroll = 1; 


- (id)initWithFrame:(CGRect)frame { 

    self = [super initWithFrame:frame]; 
    if (self) { 

     mainMenuAppDelegate *del = (mainMenuAppDelegate *)[[UIApplication sharedApplication] delegate]; 

     map_List = [[NSMutableArray alloc] init]; 
     [map_List addObject:@"Pacific_Map.png"]; 
     [map_List addObject:@"Atlantic_Map.png"]; 


     CGRect mapScrollViewFrame = CGRectMake(0, 0, 1024, 768); 

     mapScrollView = [[UIScrollView alloc] initWithFrame:mapScrollViewFrame]; 

     mapScrollView.backgroundColor = [UIColor blackColor]; 

     [mapScrollView setDelegate:(id<UIScrollViewDelegate>)self]; 

     mapScrollView.contentSize = CGSizeMake(2437, 1536); 

     mapScrollView.bounces = NO; 

     mapScrollView.bouncesZoom = NO; 

     mapScrollView.minimumZoomScale = .5; 

     mapScrollView.maximumZoomScale = 1.5; 

     [mapScrollView setZoomScale:mapScrollView.minimumZoomScale]; 

     UIImage *mapImage = [UIImage imageNamed:[map_List objectAtIndex:mapNum]]; 
     mapImageView = [[UIImageView alloc] initWithImage: mapImage]; 
     [mapImage release]; 

     if(exScreenEnabled==1){ 
      UIImage *mapImageEx = [UIImage imageNamed:[map_List objectAtIndex:mapNum]]; 
      mapImageViewEx = [[UIImageView alloc] initWithImage: mapImageEx]; 
      [mapImageEx release]; 

      UIView *containerExViewP = (UIView*)[del.switchExVC.view viewWithTag:9000]; 
      [containerExViewP addSubview:mapImageViewEx]; 
      [mapScrollView addSubview:mapImageView]; // see if this works ok on iPad. Map on TV AND iPad. 
     }else{ 
      [mapScrollView addSubview:mapImageView]; 
     } 

     [self addSubview:mapScrollView]; 

     mapImageView.userInteractionEnabled = YES; 


     UIImage *footerMapIMG = [UIImage imageNamed:@"footer_map_alternate.png"]; 
     UIImageView *footerMapView = [[UIImageView alloc] initWithImage:(UIImage *)footerMapIMG]; 
     CGRect footerMapFrame = CGRectMake(0, 686, 213, 82); 
     footerMapView.frame = footerMapFrame; 
     [self addSubview:footerMapView]; 
     footerMapView.image = footerMapIMG; 

     [footerMapView release]; 


     CGRect backBTNFrame = CGRectMake(20, 714, 140, 52); 
     UIButton *MAP_backButton = [[UIButton alloc] init]; 
     MAP_backButton.frame = backBTNFrame; 
     UIImage *MAP_backButtonIMG = [UIImage imageNamed:@"button_back.png"]; 
     [MAP_backButton setImage:MAP_backButtonIMG forState:UIControlStateNormal]; 
     MAP_backButton.backgroundColor = [UIColor clearColor]; 
     [self addSubview:MAP_backButton]; 

     [MAP_backButton release]; 


     [MAP_backButton addTarget:del.switchVC 
          action:@selector(gotoMapAndListChooser) 
         forControlEvents:UIControlEventTouchUpInside]; 

     mapScrollView.multipleTouchEnabled = YES; 
    } 
    return self; 
} 


- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{ 
    return mapImageView; 
} 

-(void)scrollViewDidZoom:(UIScrollView *)scrollView { 
    if(exScreenEnabled==1){ 
     CGPoint p = mapScrollView.contentOffset; 
     mapImageViewEx.frame = CGRectMake((p.x*-1), (p.y*-1), mapImageView.frame.size.width, mapImageView.frame.size.height); 
    } 
} 

- (void)scrollViewDidScroll:(UIScrollView *)inscrollView{ 
    if(exScreenEnabled==1 && toggleScroll==1){ 
     CGPoint p = mapScrollView.contentOffset; 
     mapImageViewEx.frame = CGRectMake((p.x*-1), (p.y*-1), mapImageView.frame.size.width, mapImageView.frame.size.height); 

    } 
} 

- (void)scrollViewWillBeginZooming:(UIScrollView *)theScrollView withView:(UIView *)view{ 
    NSLog(@"BEGIN ZOOMING"); 
    toggleScroll=0; 
} 

- (void)scrollViewDidEndZooming:(UIScrollView *)theScrollView withView:(UIView *)view atScale:(float)scale{ 
    NSLog(@"END ZOOMING"); 
    toggleScroll=1; 
} 




- (void)dealloc { 

    [mapScrollView release]; 
    [mapImageView release]; 

    [map_List release]; 

    [super dealloc]; 
} 

@end 

J'ai appuyé sur la barre d'espace (4) fois pour le code, et NOPE ne fonctionne pas débordement de pile encore cassé. :)

+1

Vous devez placer 4 espaces devant chaque ligne de code. Mais il est beaucoup plus facile de simplement mettre le code en surbrillance et d'appuyer sur le bouton «{}». – Anna

+0

Merci, je vais chercher le bouton {} la prochaine fois. – VagueExplanation

Questions connexes