2016-05-06 2 views
3

Я застрял на футляре, где я хочу масштабировать часть (rect) прокрутки в программном отношении, а не прикосновением или жестами.Увеличьте определенную область Scrollview

CGRect cropRect = CGRectMake(xPos * [UIScreen mainScreen].nativeScale, yPos * [UIScreen mainScreen].nativeScale, width1 * [UIScreen mainScreen].nativeScale, height1 * [UIScreen mainScreen].nativeScale); 
[self.scrlVPhoto zoomToRect:cropRect animated:YES]; 

Я установил делегат, а также реализовал метод делегирования.

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)aScrollView { 
    return self.containerView; 
} 

self.containerView - это вид, который я хочу увеличить.

Я пробовал все, и я все еще смущен, как выйти из этого.

Пожалуйста, кто-то может мне помочь. Любая помощь приветствуется.

Заранее благодарен.

+0

Это может помочь вам: http://stackoverflow.com/questions/10454916/convertrect-accounting-for-uiscrollview-zoom-and-contentoffset – jlew

+0

подкласс Scrollview и реализовать zoomToRect в подклассе. Это поможет вам http://www.timoliver.com.au/2012/01/14/zooming-to-a-point-in-uiscrollview/ –

+0

попробуйте этот scrollView.zoomScale = (scrollView.zoomScale + 0.1); –

ответ

1

Я собираюсь ответить на свой вопрос.

Я искал множество статей и часов отладки. Я обнаружил, что при масштабировании scrollview на самом деле его contentSize увеличивается, а zoomScale остается неизменным.

Так что я просто использовал свойство transform объекта subview scrollview (т. Е. self.containerView) и установил содержимое прокруткиОбъект. Я получил то, что искал.

self.containerView.transform = CGAffineTransformMakeScale(1.8, 1.8); // containerView is subview of scrollview and 1.8 is zoom scale just for eg. 
[self.scrlVPhoto setContentOffset:CGPointMake(self.scrlVPhoto.contentOffset.x, (self.scrlVPhoto.contentOffset.y + cropRect.origin.y)) animated:true]; 
0

Вы должны добавить представление, которое вы хотите увеличить внутри прокрутки. Внутри метода делегата верните представление, которое вы хотите увеличить.

+0

'self.containerView' является подвидью scrollview и возвращается из метода делегата scrollview. –

0

меня Создать UIImageView, установите опцию масштабирования в ImageView, когда двойное нажатие или одним нажатием на UIImageView и код приведен ниже,

viewDidLoad Метод:

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)]; 

    [doubleTap setNumberOfTapsRequired:2]; 

DoubleTab Метод:

- (void)handleDoubleTap:(UIGestureRecognizer *)gestureRecognizer { 
    // zoom in 
    float newScale = [myscrollview zoomScale] * 2; 

    if (newScale > self.myscrollview.maximumZoomScale){ 
     newScale = self.myscrollview.minimumZoomScale; 
     CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer.view]]; 

     [myscrollview zoomToRect:zoomRect animated:YES]; 

    } 
    else{ 

     newScale = self.myscrollview.maximumZoomScale; 
     CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer.view]]; 

     [myscrollview zoomToRect:zoomRect animated:YES]; 
    } 
} 


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

     CGRect zoomRect; 

     // 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 = [myscrollview frame].size.height/scale; 
     zoomRect.size.width = [myscrollview 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); 

     return zoomRect; 
    } 

И вам нужны методы делегата приведены ниже,

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    if (vmov==nil) 
    { 

    float newwidth; 
    float newheight; 

    UIImage *image=detaimageview.image; 

    if (image.size.height>=image.size.width){ 
     newheight=detaimageview.frame.size.height; 
     newwidth=(image.size.width/image.size.height)*newheight; 

     if(newwidth>detaimageview.frame.size.width){ 
      float diff=detaimageview.frame.size.width-newwidth; 
      newheight=newheight+diff/newheight*newheight; 
      newwidth=detaimageview.frame.size.width; 

     } 

    } 
    else{ 
     newwidth=detaimageview.frame.size.width; 
     newheight=(image.size.height/image.size.width)*newwidth; 

     if(newheight>detaimageview.frame.size.height){ 
      float diff=detaimageview.frame.size.height-newheight; 
      newwidth=newwidth+diff/newwidth*newwidth; 
      newheight=detaimageview.frame.size.height; 

      myscrollview.clipsToBounds = NO; 

     } 
    } 
    CGRect frame; 
    CGFloat screenWidth; 
    CGFloat screenHeight; 
    CGRect screenRect = [[UIScreen mainScreen] bounds]; 
    screenWidth = screenRect.size.width; 
    screenHeight = screenRect.size.height-64; 
    frame.size.width = newwidth; 
    frame.size.height = newheight; 
    self.myscrollview.contentSize = frame.size; 
    float x,y; 
    x=0; 
    y=0; 
    if (newheight<screenHeight) 
    { 
     x =screenHeight/2-newheight/2; 
    } 
    if (newwidth<screenWidth) 
    { 
     y =screenWidth/2-newwidth/2; 
    } 
    self.detaimageview.frame = CGRectMake(y,x,newwidth,newheight); 

    return self.detaimageview; 
    } 

    return nil; 
} 

это выше коды масштабирования ImageView и его работу для моих проектов,

надеюсь, что его полезно

+0

Как я уже сказал, я хочу масштабировать scrollview программно ... не прикосновением, жестом и т. Д. –

+0

Хорошо, я знаю, я отправляю метод, но я четко объясняю –

0

Пожалуйста, проверьте это. Может быть полезно вам

-(void)handlePinchWithGestureRecognizer:(UIPinchGestureRecognizer *)pinchGestureRecognizer{ 

     //[self.superImage_View setAlpha:0.5]; 

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

    if ([pinchGestureRecognizer state] == UIGestureRecognizerStateBegan || 
    [pinchGestureRecognizer state] == UIGestureRecognizerStateChanged){ 



     CGFloat currentScale = [[[pinchGestureRecognizer view].layer valueForKeyPath:@"transform.scale"] floatValue]; 

    // Constants to adjust the max/min values of zoom 
     const CGFloat kMaxScale = 2.0; 
     const CGFloat kMinScale = 1.0; 

     CGFloat newScale = 1-(lastScale-[pinchGestureRecognizer scale]) ; // new scale is in the range (0-1) 
     newScale = MIN(newScale, kMaxScale/currentScale); 
     newScale = MAX(newScale, kMinScale/currentScale); 
     CGAffineTransform transform = CGAffineTransformScale([[pinchGestureRecognizer view] transform], newScale, newScale); 
    [pinchGestureRecognizer view].transform = transform; 

    lastScale = [pinchGestureRecognizer scale]; // Store the previous scale factor for the next pinch gesture call 


} 
    if ([pinchGestureRecognizer state] == UIGestureRecognizerStateEnded) { 
      [undoList addObject:cropImage]; 
    } 
} 
+0

Я не хочу использовать жесты. Я хочу это программно. –

Смежные вопросы