UIScroll view для комического приложения - PullRequest
0 голосов
/ 08 марта 2011

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

  • Пинч-зум
  • Вращение
  • Дважды нажмите и переместите комикс

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

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

Вот мой код контроллера:

#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)

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

1 Ответ

0 голосов
/ 08 марта 2011

Относительно 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;  
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...