gpt4 book ai didi

objective-c - UISwipeGestureRecognizer 调用了两次

转载 作者:搜寻专家 更新时间:2023-10-30 19:51:06 29 4
gpt4 key购买 nike

我在实现一个 View 时遇到问题。

这是一个在 CATiledLayer 中显示 pdf 页面的 View 。该平铺 View 位于 UISCrollView 内。

我将 View 控制为“ZoomingPDFView”苹果示例。我做了一些修改,以便在未启用滚动时识别滑动手势,并在本网站的各种主题和问题中提供建议。当时,手势被称为一次。但由于我需要解耦 View 并委托(delegate)滑动来缓存页面并实现多功能 View ,我创建了一个 View Controller 来处理滑动手势,页面加载方法提高了 pdf View 的性能。

现在我的 View 在一侧, Controller 在另一侧,滑动手势被检测到两次,我什至无法获得问题的线索。

这是控制台输出

2010-11-19 11:45:08.370 ZoomingPDFViewerForIPad[20327:207] initWithFrame and page
2010-11-19 11:45:08.530 ZoomingPDFViewerForIPad[20327:207] drawPage
2010-11-19 11:45:08.531 ZoomingPDFViewerForIPad[20327:207] scale: 1.000000
2010-11-19 11:45:08.531 ZoomingPDFViewerForIPad[20327:207] pdf scale: 1.290062
2010-11-19 11:45:08.532 ZoomingPDFViewerForIPad[20327:207] pdf initial scale: 1.290062
2010-11-19 11:45:15.488 ZoomingPDFViewerForIPad[20327:207] left
2010-11-19 11:45:15.489 ZoomingPDFViewerForIPad[20327:207] left
2010-11-19 11:45:15.490 ZoomingPDFViewerForIPad[20327:207] initWithFrame and page
2010-11-19 11:45:15.538 ZoomingPDFViewerForIPad[20327:207] drawPage
2010-11-19 11:45:15.538 ZoomingPDFViewerForIPad[20327:207] scale: 1.000000
2010-11-19 11:45:15.539 ZoomingPDFViewerForIPad[20327:207] pdf scale: 1.290062
2010-11-19 11:45:15.539 ZoomingPDFViewerForIPad[20327:207] pdf initial scale: 1.290062
2010-11-19 11:45:15.540 ZoomingPDFViewerForIPad[20327:1a07] initWithFrame and page
2010-11-19 11:45:15.541 ZoomingPDFViewerForIPad[20327:5f07] initWithFrame and page
2010-11-19 11:45:15.593 ZoomingPDFViewerForIPad[20327:1a07] drawPage
2010-11-19 11:45:15.594 ZoomingPDFViewerForIPad[20327:1a07] scale: 1.000000
2010-11-19 11:45:15.594 ZoomingPDFViewerForIPad[20327:1a07] pdf scale: 1.290062
2010-11-19 11:45:15.595 ZoomingPDFViewerForIPad[20327:1a07] pdf initial scale: 1.290062
2010-11-19 11:45:15.695 ZoomingPDFViewerForIPad[20327:5f07] drawPage
2010-11-19 11:45:15.704 ZoomingPDFViewerForIPad[20327:5f07] scale: 1.000000
2010-11-19 11:45:15.707 ZoomingPDFViewerForIPad[20327:5f07] pdf scale: 1.290062
2010-11-19 11:45:15.713 ZoomingPDFViewerForIPad[20327:5f07] pdf initial scale: 1.290062

代码如下:

#import <UIKit/UIKit.h>

@class TiledPDFView;
@protocol PDFScrollViewDelegate;

@interface PDFScrollView : UIScrollView <UIScrollViewDelegate> {
// The TiledPDFView that is currently front most
TiledPDFView *pdfView;
// The old TiledPDFView that we draw on top of when the zooming stops
TiledPDFView *oldPDFView;


// A low res image of the PDF page that is displayed until the TiledPDFView
// renders its content.
UIImageView *backgroundImageView;


id<PDFScrollViewDelegate,NSObject> pdfViewDelegate;

// current pdf zoom scale
CGFloat pdfScale;

CGPDFPageRef page;
CGPDFDocumentRef pdf;
CGFloat initialScale;
TiledPDFView *initialTiledView;
int currentPage;
int pageCount;

UITapGestureRecognizer *doubleTap,*twoFingerDoubleTap;
UISwipeGestureRecognizer *rightSwipe, *leftSwipe;



}

@property (nonatomic,retain) id<PDFScrollViewDelegate> pdfViewDelegate;
-(id)initWithFrame:(CGRect)rect;
-(id)initWithFrame:(CGRect)frame andPDFPage:(CGPDFPageRef)aPage;
-(void)enableGestures;
-(void)drawPage;
@end

@implementation PDFScrollView
@synthesize pdfViewDelegate;

….

-(void)enableGestures{
leftSwipe = [[UISwipeGestureRecognizer alloc ]initWithTarget:self action:@selector(handleRightSwipe:)];

leftSwipe.direction = UISwipeGestureRecognizerDirectionRight;

[self addGestureRecognizer:leftSwipe];

//add right swipe
rightSwipe = [[UISwipeGestureRecognizer alloc ]initWithTarget:self action:@selector(handleLeftSwipe:)];
rightSwipe.direction = UISwipeGestureRecognizerDirectionLeft;
[self addGestureRecognizer:rightSwipe];



doubleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleDoubleTap:)];
doubleTap.numberOfTapsRequired =2;
doubleTap.numberOfTouchesRequired =1;
[self addGestureRecognizer:doubleTap];


twoFingerDoubleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleTwoFingerDoubleTap:)];
twoFingerDoubleTap.numberOfTapsRequired =2;
twoFingerDoubleTap.numberOfTouchesRequired =2;
[self addGestureRecognizer:twoFingerDoubleTap];


}

// some more code
@end

#import <UIKit/UIKit.h>
#import "PDFScrollViewDelegate.h"
@class TiledPDFView;


@interface ZoomingPDFViewerForIPadViewController : UIViewController <UIScrollViewDelegate,PDFScrollViewDelegate> {

CGPDFPageRef page;



CGPDFDocumentRef pdf;

NSInteger currentPage;



NSInteger pageCount;

PDFScrollView *myScrollView;

PDFScrollView *previousPage;
PDFScrollView *nextPage;

}

-(id)initWithResourcePath:(NSString*)path ;
-(void)loadNextPage;
-(void)loadPreviousPage;
@end


@implementation ZoomingPDFViewerForIPadViewController

// some more code
#pragma mark -
#pragma mark PDFScrollViewDelegate methods
/*
called when user swipes right on the view
*/

-(void)viewDetectedRightSwipe:(PDFScrollView*)pdfScrollView withGesture:(UISwipeGestureRecognizer*)recognizer {
NSLog(@"right");
if (currentPage>1){
//decreate page counter
currentPage--;


// release old next page

if(nextPage){
[nextPage release];
}
// set the actual page as the next one
nextPage = [myScrollView retain];

// remove the view from the actual view
[myScrollView removeFromSuperview];

// check if the previous page is loaded
if(!previousPage)
[self loadPreviousPage];

// set the previouse page as the actual page
myScrollView = previousPage;

myScrollView.pdfViewDelegate = self;
//[myScrollView drawPage];
// load a new previous page
//[NSThread detachNewThreadSelector:@selector(loadNextPage) toTarget:self withObject:nil];
//[self loadNextPage];


}
}
/*
called when user swipes left on the view
*/
-(void)viewDetectedLeftSwipe:(PDFScrollView*)pdfScrollView withGesture:(UISwipeGestureRecognizer*)recognizer{
NSLog(@"left");
// if the end of the document isn't reached
if (currentPage<pageCount){
//increment current page
currentPage++;
// if a previous page has been loaded release it
if (previousPage) {
[previousPage release];
}
// assing the actual view to as a previous page and retain it before it gets release by superview
previousPage = [myScrollView retain];
// remove the view from the super view
[myScrollView removeFromSuperview];

// if a next page hasn't beeen loaded yet, load it on this thread
if (!nextPage)
[self loadNextPage];

// assign the next page as the current page
myScrollView = nextPage;

// put the current page the delegate
myScrollView.pdfViewDelegate = self;

// add the current page to the super view
[[self view] addSubview:myScrollView];

// load a next page.
[NSThread detachNewThreadSelector:@selector(loadNextPage) toTarget:self withObject:nil];
//[self loadNextPage];


}

}

/*
called when the user taps the screen
*/
-(void)viewDetectedTapping:(PDFScrollView*)pdfScrollView withGesture:(UITapGestureRecognizer*)recognizer {
NSLog(@"tapped");
[myScrollView setZoomScale:1.0f animated:YES];


}


-(void)loadNextPage {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
CGPDFPageRef aPage = CGPDFDocumentGetPage(pdf, currentPage+1);
nextPage = [[PDFScrollView alloc] initWithFrame:myScrollView.frame andPDFPage:aPage ];
[pool release];
}



-(void)loadPreviousPage {

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
CGPDFPageRef aPage = CGPDFDocumentGetPage(pdf, currentPage-1);
previousPage = [[PDFScrollView alloc] initWithFrame:myScrollView.frame andPDFPage:aPage];
[pool release];
}
@end

这是手势触发的代码。

-(void)handleRightSwipe:(UIGestureRecognizer*)gesture {


if ([pdfViewDelegate respondsToSelector:@selector(viewDetectedRightSwipe:withGesture:)]) {
UISwipeGestureRecognizer *swipe = (UISwipeGestureRecognizer*)gesture;
[pdfViewDelegate viewDetectedRightSwipe:self withGesture:swipe];

}




}
-(void)handleLeftSwipe :(UIGestureRecognizer*)gesture{


if ([pdfViewDelegate respondsToSelector:@selector(viewDetectedLeftSwipe:withGesture:)]) {
UISwipeGestureRecognizer *swipe= (UISwipeGestureRecognizer*)gesture;
[pdfViewDelegate viewDetectedLeftSwipe:self withGesture:swipe];

}

}

提前感谢您的宝贵时间

最佳答案

我遇到了完全相同的问题,我的猜测是执行此行时触发了第二个操作:

[myScrollView removeFromSuperview];

出于某种原因,UISwipeGestureRecognizer 在它所附加的 View 被移除时触发。似乎没有其他 UIGestureRecognizer 可以做到这一点。

我的解决方案是在调用 removeFromSuperview 之前禁用所有手势识别器:

for (UIGestureRecognizer *g in myScrollView.gestureRecognizers) {
g.enabled = NO;
g.delegate = nil;
}
[myScrollView removeFromSuperview];

它并不理想,但它确实起到了作用。

关于objective-c - UISwipeGestureRecognizer 调用了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4226239/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com