Ущипнуть, чтобы сделать фото на весь экран, как приложения Reeder - PullRequest
4 голосов
/ 11 августа 2011

Попытка придумать метод, позволяющий сделать то же самое, что и создатель приложений Reeder, в своих приложениях для iphone / ipad с фотографиями, позволяющими увеличивать изображение, до полного экрана.Ячейка таблицы, которую я хочу перевести в полноэкранный режим, при открытии щепотки или, возможно, двойным нажатием.Хотелось бы использовать похожую анимацию.

Любые советы будут оценены!

Ответы [ 3 ]

13 голосов
/ 13 августа 2011

Хорошо, я сумел собрать это сам. Не совсем уверен, как использовать метод перехода, но мне нужно было продублировать вид в том же месте, а затем взорвать его.

http://screencast.com/t/MLTuGkIYh

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

    self.imageView.contentMode = UIViewContentModeScaleAspectFit;
    self.imageView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
    UIPinchGestureRecognizer *pinchGesture = [[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)] autorelease];
    UITapGestureRecognizer *tapGesture = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)] autorelease];
    tapGesture.numberOfTapsRequired = 2;
    self.imageView.userInteractionEnabled = YES;
    self.imageView.multipleTouchEnabled = YES;
    [self.imageView addGestureRecognizer:pinchGesture]; 
    [self.imageView addGestureRecognizer:tapGesture];
    [cell.contentView addSubview:self.imageView];

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

- (void)handlePinchGesture:(id)sender
{
    if (((UIPinchGestureRecognizer *)sender).state == UIGestureRecognizerStateEnded) {
        if(((UIPinchGestureRecognizer *)sender).view == self.imageView)
        {
            if (((UIPinchGestureRecognizer *)sender).scale > 1) {
                [self showFloorPlanFullScreen];
            }
        } else {
            if (((UIPinchGestureRecognizer *)sender).scale < 1) {
                [self closeFloorPlanFullScreen];
            }
        }
    }
}
- (void)handleTap:(id)sender
{
    if (((UITapGestureRecognizer *)sender).view == self.imageView) {
        [self showFloorPlanFullScreen];
    } else {
        [self closeFloorPlanFullScreen];
    }
}

- (void)showFloorPlanFullScreen
{
    CGRect newRect = [self.imageView convertRect:self.imageView.bounds toView:[self.splitViewController.view superview]];
    UIImage *image = self.imageView.image;
    self.fullScreenImageView = [[[UIImageView alloc] initWithImage:image] autorelease];

    UIPinchGestureRecognizer *pinchGesture = [[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)] autorelease];
    UITapGestureRecognizer *tapGesture = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)] autorelease];
    tapGesture.numberOfTapsRequired = 2;
    self.fullScreenImageView.userInteractionEnabled = YES;
    self.fullScreenImageView.multipleTouchEnabled = YES;
    [self.fullScreenImageView addGestureRecognizer:pinchGesture]; 
    [self.fullScreenImageView addGestureRecognizer:tapGesture];

    self.fullScreenImageView.contentMode = UIViewContentModeScaleAspectFit;
    self.fullScreenImageView.frame = newRect;
    self.fullScreenImageView.backgroundColor = [UIColor clearColor];
    [[self.splitViewController.view superview] addSubview:self.fullScreenImageView];

    CGRect splitViewRect = self.splitViewController.view.frame;
    [UIView animateWithDuration:0.5 animations:^{
        self.fullScreenImageView.backgroundColor = [UIColor blackColor];
        self.fullScreenImageView.frame = splitViewRect;
    }];
}


- (void)closeFloorPlanFullScreen
{
    CGRect newRect = [self.imageView convertRect:self.imageView.bounds toView:[self.splitViewController.view superview]];
    [UIView animateWithDuration:0.5 
                     animations:^{
        self.fullScreenImageView.backgroundColor = [UIColor clearColor];
        self.fullScreenImageView.frame = newRect;
                    } 
                     completion:^(BOOL finished) {
                         [self.fullScreenImageView removeFromSuperview];
                         self.fullScreenImageView = nil;
                     }];
}

Если вы хотите, чтобы при реальном масштабировании изображение имело реальный размер, я бы порекомендовал добавить дублированный вид, как только начинается зажим (и до тех пор, пока его масштабирование> 1), а затем применить преобразование:

CGAffineTransform myTransformation = CGAffineTransformMakeScale(((UIPinchGestureRecognizer *)sender).scale, ((UIPinchGestureRecognizer *)sender).scale);
self.fullScreenImageView.transform = myTransformation;

Как только зажим достигает конечного состояния, я затем исчезаю в черном и настраиваю рамку. Я решил не использовать этот метод, так как думаю, что достаточно просто распознать пинч или двойное касание.

0 голосов
/ 11 августа 2011

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

0 голосов
/ 11 августа 2011

Вы должны встроить свой UIImageView в UIControl и связать IBAction с событиями UIControl.

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