2011-11-08 88 views
2

我的UIImage未使用以下代碼進行縮放。輕拍被認可,但變焦不起作用。它基本上是iOS開發站點的taptozoom代碼,導航控制器位於UIScrollView和UIImageView之後。這個TapToZoom代碼在沒有導航控制器的情況下工作。圖像拉伸是否存在問題,以允許頂部的導航欄?圖像無法響應雙擊縮放

#import "Map.h" 

#define ZOOM_VIEW_TAG 100 
#define ZOOM_STEP 1.5 


@interface Map (UtilityMethods) 
- (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center; 
@end 


@implementation Map 

@synthesize imageScrollView, imageView; 

- (void)loadView { 
    //imageScrollView.userInteractionEnabled = YES; 
    // [self.imageView setUserInteractionEnabled:YES]; 
    //[self.imageView setMultipleTouchEnabled:YES]; 
    NSLog(@"beginning of loadView in map.m"); 

    [super loadView]; 




    // set the tag for the image view 
    [imageView setTag:ZOOM_VIEW_TAG]; 
    //imageScrollView.scrollEnabled = NO; 

    // add gesture recognizers to the image view 
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; 
    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)]; 
    UITapGestureRecognizer *twoFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTwoFingerTap:)]; 

    [doubleTap setNumberOfTapsRequired:2]; 
    [twoFingerTap setNumberOfTouchesRequired:2]; 

    [imageView addGestureRecognizer:singleTap];  //added self to fix subview 
    [imageView addGestureRecognizer:doubleTap]; 
    [imageView addGestureRecognizer:twoFingerTap]; 

    [singleTap release]; 
    [doubleTap release]; 
    [twoFingerTap release]; 

    // calculate minimum scale to perfectly fit image width, and begin at that scale 
    float minimumScale = [imageScrollView frame].size.width/[imageView frame].size.width; 
    [imageScrollView setMinimumZoomScale:minimumScale]; 
    [imageScrollView setZoomScale:minimumScale]; 
} 


- (void)viewDidUnload { 
    self.imageScrollView = nil; 
    self.imageView = nil; 
} 


- (void)dealloc { 
    [imageScrollView release]; 
    [imageView release]; 
    [super dealloc]; 
} 

#pragma mark UIScrollViewDelegate methods 

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { 
    return [imageScrollView viewWithTag:ZOOM_VIEW_TAG]; 
} 

/************************************** NOTE **************************************/ 
/* The following delegate method works around a known bug in zoomToRect:animated: */ 
/* In the next release after 3.0 this workaround will no longer be necessary  */ 
/**********************************************************************************/ 
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale { 
    [scrollView setZoomScale:scale+0.01 animated:NO]; 
    [scrollView setZoomScale:scale animated:NO]; 
} 

#pragma mark TapDetectingImageViewDelegate methods 

- (void)handleSingleTap:(UIGestureRecognizer *)gestureRecognizer { 
    // single tap does nothing for now 
    NSLog(@"single tap detected"); 
} 

- (void)handleDoubleTap:(UIGestureRecognizer *)gestureRecognizer { 
    // double tap zooms in 
    NSLog(@"beginning handleDoubleTap to zoom"); 
    float newScale = [imageScrollView zoomScale] * ZOOM_STEP; 
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer.view]]; 
    [imageScrollView zoomToRect:zoomRect animated:YES]; 
} 

- (void)handleTwoFingerTap:(UIGestureRecognizer *)gestureRecognizer { 
    // two-finger tap zooms out 
    float newScale = [imageScrollView zoomScale]/ZOOM_STEP; 
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer.view]]; 
    [imageScrollView zoomToRect:zoomRect animated:YES]; 
} 

#pragma mark UIScroll Subview 




#pragma mark Utility methods 

- (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center { 

    CGRect zoomRect; 
    NSLog(@"zoomRectForScale"); 

    // the zoom rect is in the content view's coordinates. 
    // At a zoom scale of 1.0, it would be the size of the imageScrollView's bounds. 
    // As the zoom scale decreases, so more content is visible, the size of the rect grows. 
    zoomRect.size.height = [imageScrollView frame].size.height/scale; 
    zoomRect.size.width = [imageScrollView frame].size.width/scale; 

    // choose an origin so as to get the right center. 
    zoomRect.origin.x = center.x - (zoomRect.size.width/2.0); 
    zoomRect.origin.y = center.y - (zoomRect.size.height/2.0); 

    NSLog(@"end of zoom rect"); 
    return zoomRect; 
} 

@end 

回答

0

ImageViews默認情況下不被默認的用戶交互作出響應,喲必須將其設置:

imageView.userInteractionEnabled = YES; 
+0

感謝奧斯卡嘗試。我會喜歡這個修復它,但它仍然不縮放。 –

+0

頂部有一個導航欄,我想知道是否會干擾它。 –

+0

我也從調試器得到這個錯誤信息2011-11-09 13:13:42。1201 Robofair2011 [353:707]由於手勢識別器未激活,忽略對[UIPanGestureRecognizer setTranslation:inView:]的調用。 –

0

你需要確保爲雙擊單輕叩識別等待失敗。

[singleTap requireGestureRecognizerToFail:doubleTap]; 
0

-loadView必須重寫只初始化self.view - 沒有別的。由於我看不到初始化您的self.view的代碼,我認爲您的視圖來自nib文件,因此您不能覆蓋-loadView方法,或者如果超類處理此初始化,您不必覆蓋它並請致電[super loadView],但您放在那裏的代碼完全在錯誤的地方。把你所有的邏輯viewDidLoad除了線:

// calculate minimum scale to perfectly fit image width, and begin at that scale 
    float minimumScale = [imageScrollView frame].size.width/[imageView frame].size.width; 
    [imageScrollView setMinimumZoomScale:minimumScale]; 
    [imageScrollView setZoomScale:minimumScale]; 

這些投入viewWillAppear:,因爲這是視圖層次的幾何形狀已經被正確設置的地方,你可以有準確的frame性能。

0

導入 「RootViewController.h」

限定ZOOM_VIEW_TAG 100

限定ZOOM_STEP 1.5

@interface RootViewController的(UtilityMethods) - (的CGRect)zoomRectForScale:(浮點)比例withCenter:(CGPoint)中央; @end

@implementation RootViewController的

@synthesize imageScrollView,ImageView的,mySlider;

  • (IBAction爲)sliderValueChanged:(UISlider *)發件人{ mySlider.value = [NSString的stringWithFormat:imageScrollView [發送方值]];

    //mySlider.value = [NSString stringWithFormat:@「%.1f」,[sender value]];

    //myTextField.text = [NSString stringWithFormat:@「%。1F」,[發送方值]];}

  • (無效)的loadView { [超級的loadView];

    //設置圖像視圖標籤 [ImageView的setTag:ZOOM_VIEW_TAG];

    //手勢識別添加到圖像視圖 UITapGestureRecognizer * singleTap = [[UITapGestureRecognizer的alloc] initWithTarget:自動作:@selector(handleSingleTap :)]; UITapGestureRecognizer * doubleTap = [[UITapGestureRecognizer的alloc] initWithTarget:自行動:@選擇器(handleDoubleTap :)]; UITapGestureRecognizer * twoFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTwoFingerTap :)];

    [doubleTap setNumberOfTapsRequired:2]; [twoFingerTap setNumberOfTouchesRequired:2];

    [imageView addGestureRecognizer:singleTap]; [imageView addGestureRecognizer:doubleTap]; [imageView addGestureRecognizer:twoFingerTap];

    [singleTap release]; [doubleTap release]; [twoFingerTap發佈];

    //計算最小比例尺以完全適合圖片寬度,並從該比例開始 float minimumScale = [imageScrollView frame] .size.width/[imageView frame] .size.width; [imageScrollView setMinimumZoomScale:minimumScale]; [imageScrollView setZoomScale:minimumScale]; }

  • (void)viewDidUnload {0} 0 0 0 0 self.imageScrollView = nil; 自我。imageView = nil; }

  • (void)dealloc {imageScrollView release]; [imageView發佈]; [super dealloc]; }

編譯標記UIScrollViewDelegate方法

  • (UIView的*)viewForZoomingInScrollView:(UIScrollView中*)滾動視圖{ 返回[imageScrollView viewWithTag:ZOOM_VIEW_TAG]; }

/* ** * ** * ** * ** * ** * ** * *注意* ** * ** * ** * ** * ** * ** * */ /*下面的委託方法能解決一個已知的bug在zoomToRect:動畫:/ /在下一版本後3.0這一解決辦法不再有必要/ / ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * **/(無效)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {scrollView setZoomScale:scale + 0.01 animated:NO]; [scrollView setZoomScale:scale animated:NO]; }

編譯標誌TapDetectingImageViewDelegate方法

  • (無效)handleSingleTap:(UIGestureRecognizer *)gestureRecognizer {// 單一的水龍頭什麼都不做,現在 }

  • (無效)handleDoubleTap :(UIGestureRecognizer *)gestureRecognizer { //雙擊放大 float newScale = [imageScrollView zoomScale] * ZOOM_STEP; CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer。視圖]]; [imageScrollView zoomToRect:zoomRect animated:YES]; }

  • (無效)handleTwoFingerTap:(UIGestureRecognizer *)gestureRecognizer { //二指點擊縮小 浮子newScale = [imageScrollView zoomScale]/ZOOM_STEP; CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer.view]]; [imageScrollView zoomToRect:zoomRect animated:YES]; }

編譯標記實用方法

  • (的CGRect)zoomRectForScale:(浮點)比例withCenter:(CGPoint)中心{

    的CGRect zoomRect;

    //縮放矩形位於內容視圖的座標中。 //在1.0的縮放比例下,它將是imageScrollView邊界的大小。 //隨着縮放比例縮小,更多內容可見,矩形的大小增加。 zoomRect.size.height = [imageScrollView frame] .size.height/scale; zoomRect.size.width = [imageScrollView frame] .size.width/scale;

    //選擇一個原點以獲得正確的中心。 zoomRect.origin.x = center.x - (zoomRect.size.width/2.0); zoomRect.origin.y = center.y - (zoomRect.size.height/2.0);

    return zoomRect; }

@end

+0

請正確格式化您的代碼。此外,如果您能總結出您所做的更改,那麼最終用戶和其他人會更加關注這個問題,因此更易於理解。 – dpassage