5

我有一個uipageviewcontroller並在uipageviewcontroller中設置了一個名爲contentviewcontroller的子視圖控制器。如何在uipageviewcontroller中放大或縮小?

thePageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation: UIPageViewControllerNavigationOrientationHorizontal options:nil]; 

    thePageViewController.delegate = self; 
    thePageViewController.dataSource = self; 

    thePageViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

    contentViewController = [[HBDocumentChildViewController alloc] initWithPDF:PDFDocument]; 
    contentViewController.page = [modelArray objectAtIndex:0]; 
    NSArray *viewControllers = [NSArray arrayWithObject:contentViewController]; 
    [thePageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 

    [self addChildViewController:thePageViewController]; 
    [self.view addSubview:thePageViewController.view]; 
    thePageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); 
    [thePageViewController didMoveToParentViewController:self]; 
    self.view.gestureRecognizers = thePageViewController.gestureRecognizers; 
    self.view.backgroundColor = [UIColor underPageBackgroundColor]; 

我做了將PDF文件加載到頁面中uipageviewcontroller與滾動視圖類(pdfScrollView)。該followig是內容類uipageviewcontroller和初始化的UIScrollView類的幫助。

#import "HBDocumentChildViewController.h" 

@interface HBDocumentChildViewController()<UIWebViewDelegate> 
{ 
    int currentPage; 
    NSString*localPath; 
} 

@end 

@implementation HBDocumentChildViewController 

#pragma mark - View lifecycle 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // Create our PDFScrollView and add it to the view controller. 
    CGPDFPageRef PDFPage = CGPDFDocumentGetPage(thePDF, [_page intValue]); 
    pdfScrollView = [[PDFScrollView alloc] initWithFrame:self.view.frame]; 
    [pdfScrollView setPDFPage:PDFPage]; 
    [self.view addSubview:pdfScrollView]; 
    self.view.backgroundColor = [UIColor whiteColor]; 
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
    pdfScrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
} 

以下是UIScrollView的類,

/* 
    File: PDFScrollView.m 
Abstract: UIScrollView subclass that handles the user input to zoom the PDF page. This class handles swapping the TiledPDFViews when the zoom level changes. 
    Version: 2 


*/ 

#import "PDFScrollView.h" 
#import "TiledPDFView.h" 
#import <QuartzCore/QuartzCore.h> 


@interface PDFScrollView() 

// A low resolution image of the PDF page that is displayed until the TiledPDFView renders its content. 
@property (nonatomic, weak) UIImageView *backgroundImageView; 

// The TiledPDFView that is currently front most. 
@property (nonatomic, weak) TiledPDFView *tiledPDFView; 

// The old TiledPDFView that we draw on top of when the zooming stops. 
@property (nonatomic, weak) TiledPDFView *oldTiledPDFView; 

@end 



@implementation PDFScrollView 
{ 
    CGPDFPageRef _PDFPage; 

    // Current PDF zoom scale. 
    CGFloat _PDFScale; 
    CGFloat _PDFScaleH; 
} 


@synthesize backgroundImageView=_backgroundImageView, tiledPDFView=_tiledPDFView, oldTiledPDFView=_oldTiledPDFView; 


- (id)initWithCoder:(NSCoder *)coder 
{ 
    self = [super initWithCoder:coder]; 
    if (self) { 
     self.decelerationRate = UIScrollViewDecelerationRateFast; 
     self.delegate = self; 
    } 
    return self; 
} 


- (void)setPDFPage:(CGPDFPageRef)PDFPage; 
{ 
    CGPDFPageRetain(PDFPage); 
    CGPDFPageRelease(_PDFPage); 
    _PDFPage = PDFPage; 

    // Determine the size of the PDF page. 
    CGRect pageRect = CGPDFPageGetBoxRect(_PDFPage, kCGPDFMediaBox); 
    float actualHeight = pageRect.size.height; 
    float actualWidth = pageRect.size.width; 
    float imgRatio = actualWidth/actualHeight; 
    float maxRatio = 768.0/911.0; 

    if(imgRatio!=maxRatio){ 
     if(imgRatio < maxRatio){ 
      imgRatio = 911.0/actualHeight; 
      actualWidth = imgRatio * actualWidth; 
      actualHeight = 911.0; 
     } 
     else{ 
      imgRatio = 768.0/actualWidth; 
      actualHeight = imgRatio * actualHeight; 
      actualWidth = 768.0; 
     } 
    } 
    pageRect.size = CGSizeMake(actualWidth, actualHeight); 
    UIGraphicsBeginImageContext(pageRect.size); 

    /* 
    Create a low resolution image representation of the PDF page to display before the TiledPDFView renders its content. 
    */ 
    UIGraphicsBeginImageContext(pageRect.size); 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // First fill the background with white. 
    CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0); 
    CGContextFillRect(context,pageRect); 

    CGContextSaveGState(context); 
    // Flip the context so that the PDF page is rendered right side up. 
    CGContextTranslateCTM(context, 0.0, pageRect.size.height); 
    CGContextScaleCTM(context, 1.0, -1.0); 

    // Scale the context so that the PDF page is rendered at the correct size for the zoom level. 
    CGContextScaleCTM(context, imgRatio,imgRatio); 
    CGContextDrawPDFPage(context, _PDFPage); 
    CGContextRestoreGState(context); 

    UIImage *backgroundImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 


    if (self.backgroundImageView != nil) { 
     [self.backgroundImageView removeFromSuperview]; 
    } 

    UIImageView *backgroundImageView = [[UIImageView alloc] initWithImage:backgroundImage]; 
    backgroundImageView.frame = pageRect; 
    backgroundImageView.contentMode = UIViewContentModeScaleAspectFit; 
    [self addSubview:backgroundImageView]; 
    [self sendSubviewToBack:backgroundImageView]; 
    self.backgroundImageView = backgroundImageView; 

    // Create the TiledPDFView based on the size of the PDF page and scale it to fit the view. 
    TiledPDFView *tiledPDFView = [[TiledPDFView alloc] initWithFrame:pageRect scale:imgRatio]; 
    [tiledPDFView setPage:_PDFPage]; 

    [self addSubview:tiledPDFView]; 
    self.tiledPDFView = tiledPDFView; 
} 


- (void)dealloc 
{ 
    // Clean up. 
    CGPDFPageRelease(_PDFPage); 
} 


#pragma mark - 
#pragma mark Override layoutSubviews to center content 

// Use layoutSubviews to center the PDF page in the view. 
- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    // Center the image as it becomes smaller than the size of the screen. 

    CGSize boundsSize = self.bounds.size; 
    CGRect frameToCenter = self.tiledPDFView.frame; 

    // Center horizontally. 

    if (frameToCenter.size.width < boundsSize.width) 
     frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width)/2; 
    else 
     frameToCenter.origin.x = 0; 

    // Center vertically. 

    if (frameToCenter.size.height < boundsSize.height) 
     frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height)/2; 
    else 
     frameToCenter.origin.y = 0; 

    self.tiledPDFView.frame = frameToCenter; 
    self.backgroundImageView.frame = frameToCenter; 

    /* 
    To handle the interaction between CATiledLayer and high resolution screens, set the tiling view's contentScaleFactor to 1.0. 
    If this step were omitted, the content scale factor would be 2.0 on high resolution screens, which would cause the CATiledLayer to ask for tiles of the wrong scale. 
    */ 
    self.tiledPDFView.contentScaleFactor = 1.0; 
} 


#pragma mark - 
#pragma mark UIScrollView delegate methods 

/* 
A UIScrollView delegate callback, called when the user starts zooming. 
Return the current TiledPDFView. 
*/ 
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return self.tiledPDFView; 
} 

/* 
A UIScrollView delegate callback, called when the user begins zooming. 
When the user begins zooming, remove the old TiledPDFView and set the current TiledPDFView to be the old view so we can create a new TiledPDFView when the zooming ends. 
*/ 
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view 
{ 
    // Remove back tiled view. 
    [self.oldTiledPDFView removeFromSuperview]; 

    // Set the current TiledPDFView to be the old view. 
    self.oldTiledPDFView = self.tiledPDFView; 
    [self addSubview:self.oldTiledPDFView]; 
} 


/* 
A UIScrollView delegate callback, called when the user stops zooming. 
When the user stops zooming, create a new TiledPDFView based on the new zoom level and draw it on top of the old TiledPDFView. 
*/ 
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale 
{ 
    // Set the new scale factor for the TiledPDFView. 
    _PDFScale *= scale; 
    // Calculate the new frame for the new TiledPDFView. 
    CGRect pageRect = CGPDFPageGetBoxRect(_PDFPage, kCGPDFMediaBox); 
    pageRect.size = CGSizeMake(pageRect.size.width*_PDFScale, pageRect.size.height*_PDFScale); 

    // Create a new TiledPDFView based on new frame and scaling. 
    TiledPDFView *tiledPDFView = [[TiledPDFView alloc] initWithFrame:pageRect scale:_PDFScale]; 
    [tiledPDFView setPage:_PDFPage]; 

    // Add the new TiledPDFView to the PDFScrollView. 
    [self addSubview:tiledPDFView]; 
    self.tiledPDFView = tiledPDFView; 
} 


@end 

的頁面渲染工作正常,但在輸入/輸出頁面上顯示view.The UIScrollView的委託方法不是我沒拿到變焦在uipageviewcontroller中工作。請幫我找到解決這個問題的方法。

回答

3

我做的uipageviewcontroller滾動和縮放。我已經更改了上述縮放放大的UIPinchGestureRecognizer方法,並縮小爲當前頁面大小。

-(void)pinchDetected:(UIPinchGestureRecognizer *)pinchRecognizer 

{ 
    if([pinchRecognizer state] == UIGestureRecognizerStateBegan) { 
     // Reset the last scale, necessary if there are multiple objects with different scales 
     lastScale = [pinchRecognizer scale]; 
    } 

    if ([pinchRecognizer state] == UIGestureRecognizerStateBegan ||[pinchRecognizer state] == UIGestureRecognizerStateChanged) 
    { 
     CGFloat currentScale = [[[pinchRecognizer view].layer valueForKeyPath:@"transform.scale"] floatValue]; 
     // Constants to adjust the max/min values of zoom 
     const CGFloat maxScale = 1.5; 
     const CGFloat minScale = 1.0; 

     CGFloat newScale = 1 - (lastScale - [pinchRecognizer scale]); 
     newScale = MIN(newScale, maxScale/currentScale); 
     newScale = MAX(newScale, minScale/currentScale); 
     thePageViewController.view.transform = CGAffineTransformScale(thePageViewController.view.transform, newScale, newScale); 
     lastScale = [pinchRecognizer scale]; // Store the previous scale factor for the next pinch gesture call 
    } 
} 

然後,我已經添加了[pdfScrollView setScrollEnabled:YES]; [pdfScrollView setContentSize:CGSizeMake(768,1100)];代碼在內容的ViewController(HBDocumentChildViewController)的viewDidLoad中在滾動內容查看uipageviewcontroller類。

- (void)viewDidLoad 
    { 
     [super viewDidLoad]; 

     // Create our PDFScrollView and add it to the view controller. 
     CGPDFPageRef PDFPage = CGPDFDocumentGetPage(thePDF, [_page intValue]); 
     pdfScrollView = [[PDFScrollView alloc] initWithFrame:self.view.frame]; 
     pdfScrollView.bouncesZoom = YES; 
     [pdfScrollView setScrollEnabled:YES]; 
     [pdfScrollView setContentSize:CGSizeMake(768, 1100)]; 
     [pdfScrollView setPDFPage:PDFPage]; 
     [self.view addSubview:pdfScrollView]; 
     self.view.backgroundColor = [UIColor whiteColor]; 
     self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
     pdfScrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
     pdfScrollView.delegate = pdfScrollView; 

    } 

試試此代碼縮放和縮小到當前頁面大小並滾動uipageviewcontroller的內容。

+0

http://stackoverflow.com/questions/29787541/convert-pinchrecognizer-objective-c-code-to-swift/29787599#29787599 我使用類似的代碼,但在Swift中。介意幫助我 –

5

嘗試這個

UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchDetected:)]; 
[thePageViewController addGestureRecognizer:pinchRecognizer]; 
pinchRecognizer.delegate=self; 

的方法

-(void)pinchDetected:(UIPinchGestureRecognizer *)pinchRecognizer 
{ 
    CGFloat scale = pinchRecognizer.scale; 
    thePageViewController.transform = CGAffineTransformScale(thePageViewController.transform, scale, scale); 
    pinchRecognizer.scale = 1.0; 
} 
+0

@shailni:我在哪裏可以寫這個代碼在我的項目中,請你告訴我我是新的發展 –

+0

在viewdidload創建pageview控制器後,你可以寫代碼並檢查它... – guptha

+0

@shalini:謝謝爲您的寶貴答覆。我已經嘗試過,可以放大頁面。但是有一個問題,當它放大時,沒有縮放限制。我需要放大一個限制,縮小範圍是當前頁面大小,這意味着不會縮小當前頁面大小,並且當縮放並鎖定縮放到當前頁面時,還需要滾動頁面。你能幫我找到答案嗎? – dineshthamburu