Search code examples
ipaduiscrollviewscreenexternaltelevision

Scrolling UIScrollView on external screen attached to an iPad


Hey. I've achieved making a programmatic UIScrollView with zooming, but now I've been trying to take the scrollable/zoomable image to an external screen if plugged in.

@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;
    }
}

(Sorry I've had no luck getting that formatted to look right on this site)

If a video cable is plugged into an iPad, there's no image on the iPad, which is what I want. The image on the external screen zooms correctly when you do the gesture on the iPad, but I can't figure out how to make it scroll. Thanks in advance.

edit: I now have this -

@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

As I said below, I can now get either scroll or zooming to work separately, but zooming is all messed up if scrolling is working, because when zooming it thinks it's also scrolling. So I want to avoid it scrolling when zooming, and to do this I want to detect the number of touches, which I must be doing wrong!


Solution

  • Got it working with the image being on the iPad and external screen. I'll probably swap it in with a rectangular area because the image is resource heavy to be both the iPad and external screen.

    #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
    

    I pressed the space bar (4) times for code, and NOPE doesn't work stack overflow still broken. :)