【问题标题】:How should I be scaling this map picture with UIPinchGestureRecognizer?我应该如何使用 UIPinchGestureRecognizer 缩放这张地图图片?
【发布时间】:2011-01-27 22:15:54
【问题描述】:

我非常接近能够使用UIPinchGestureRecognizer 和缩放方法以编程方式缩放地图图片。我尝试过像这样的滚动视图:[mapScrollView addGestureRecognizer:pinchRecognizer];,但这当然行不通,因为它会缩放整个视图和边界。如果我这样做[mapImageView addGestureRecognizer:pinchRecognizer] 什么都不会发生。

如何在滚动视图中缩放图像?更重要的是,如何设置最大和最小缩放范围?谢谢

代码:

- (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_8bit.png"];
        [map_List addObject:@"Atlantic_Map_8bit.png"];

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

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

        mapScrollView.contentSize = CGSizeMake(2437, 1536);

        UIImage *mapImage = [UIImage imageNamed:[map_List objectAtIndex:mapNum]];

        mapImageView = [[UIImageView alloc] initWithImage: mapImage];

        mapScrollView.bounces = NO;

        [mapImage release];

        [mapScrollView addSubview:mapImageView];
        [self addSubview:mapScrollView];

        UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scale:)];
        [mapImageView addGestureRecognizer:pinchRecognizer];

        [pinchRecognizer release];

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

-(void)scale:(id)sender {
    if([(UIPinchGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) {

        lastScale = 1.0;
        return;
    }

    CGFloat scale = 1.0 - (lastScale - [(UIPinchGestureRecognizer*)sender scale]);

    /*
    if(scale > 1){
        scale = 1;
    }
    if(scale < .5){
        scale = .5;
    }
    */

    CGAffineTransform currentTransform = [(UIPinchGestureRecognizer*)sender view].transform;
    CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale);

    [[(UIPinchGestureRecognizer*)sender view] setTransform:newTransform];

    lastScale = [(UIPinchGestureRecognizer*)sender scale];
}

【问题讨论】:

    标签: iphone xcode ipad ios pinch


    【解决方案1】:

    我不确定,我不想测试但尝试添加

    mapImageView.userInteractionEnabled = YES;
    

    没有此设置,手势在图像视图上不起作用。
    编辑:也许我把你的问题解释错了,你的缩放方法被调用但不起作用。


    顺便说一句,你读过CATiledLayer吗? WWDC10 Session Videos(Session 104 - Designing Apps with Scroll Views)中也有很好的介绍。您应该通过 developer.apple.com 观看该视频
    您应该观看它,因为 2437x1536 的图像对于 iPhone 来说是相当大的。您迟早会遇到性能和/或内存问题。

    【讨论】:

    • 谢谢!就是这样..我想我已经看到有人通过将视图包装在视图或其他东西中来解决这个问题,但这更容易。你是对的,我可能需要使用 CATiledLayer,因为我遇到了内存问题,有时会崩溃等。
    猜你喜欢
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 2013-02-24
    • 1970-01-01
    相关资源
    最近更新 更多