2011-03-08 3 views
0

Я работаю над приложением ipad для комикса, но я не могу заставить свой свиток работать. Мне это нужно сделать:UIScroll view для comic App

  • Pinch трансфокатора
  • вращения
  • Двойной кран и двигаться по комиксу

Here's пример того, что я хочу, чтобы получить http://vimeo.com/16073699 (Второй 35 + -)

Прямо сейчас у меня есть масштабирование, но я могу получить вид прокрутки для поворота и центра изображения.

Here's мой код контроллера:

#define ZOOM_VIEW_TAG 100 
#define ZOOM_STEP 2 
#define PAGE_TIME 10 

- (void)viewDidLoad{ 
    [super loadView]; 

    self.myImage.image = [UIImage imageNamed:@"Tira01.jpg"]; 

    [self.myImage setTag:ZOOM_VIEW_TAG]; 

    UISwipeGestureRecognizer *recognizer; 


    recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Tap)]; 
    [(UITapGestureRecognizer *)recognizer setNumberOfTouchesRequired:1]; 
    [(UITapGestureRecognizer *)drecognizer setNumberOfTapsRequired:1]; 
    [[self myImage] addGestureRecognizer:recognizer]; 
    [recognizer release]; 

    self.drecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)]; 
    [(UITapGestureRecognizer *)drecognizer setNumberOfTouchesRequired:1]; 
    [(UITapGestureRecognizer *)drecognizer setNumberOfTapsRequired:2]; 
    [[self myImage] addGestureRecognizer:drecognizer]; 
    [drecognizer release]; 


} 

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

- (void)handleDoubleTap:(UIGestureRecognizer *)gestureRecognizer { 
    UIInterfaceOrientation currentOrientation = [[UIDevice currentDevice] orientation]; 
    if(!self.zoomed) 
    { 
     // double tap zooms in 
     float newScale = [self.myScrollView zoomScale] * ZOOM_STEP; 
     CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer.view]]; 
     [self.myScrollView zoomToRect:zoomRect animated:YES]; 
     self.zoomed = YES; 


    } 
    else { 
     float newScale = [self.myScrollView zoomScale]/ZOOM_STEP; 
     CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer.view]]; 
     [self.myScrollView zoomToRect:zoomRect animated:YES]; 
     self.zoomed = NO;   
    } 

} 


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{ 
    return 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 = [self.myScrollView frame].size.height/scale; 
    zoomRect.size.width = [self.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 (режим ScaleToFill)

-> UIScrollView (режим ScaleToFill)

---> UIImageView (режим AspectFit)

Я не знаю, что я делаю неправильно, но я схожу с ума :(

ответ

0

Что касается UIScrollView, ориентированного на контент, я могу ошибаться здесь, но UIScrollView не делает этого автоматически.

В моем приложении я вручную делаю это, фактически перемещая содержимое в scrollView так, чтобы оно было центрировано.
Как краткое объяснение приведенного ниже кода, если кадр содержимого (изображения) меньше границ прокрутки, затем отрегулируйте положение содержимого по горизонтали и по вертикали.

Код приведен из моего класса, полученного из UIScrollView. Если вы используете UIScrollView по умолчанию, вы можете использовать этот код в родительском UIView.



- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    if (![self centersContent]) 
    { 
     return; 
    } 

    // center the image as it becomes smaller than the size of the screen  
    CGSize boundsSize = self.bounds.size; 
    CGRect frameToCenter = imageView.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; 

    imageView.frame = frameToCenter; 
}