Как оживить UIImageview для отображения полноэкранного режима, нажав на него?
У меня есть UIImageView в UITableviewCell. Когда он прослушивается, UIImageView должен анимироваться, чтобы отображаться в полноэкранном режиме. Когда изображение отображается в полноэкранном режиме, оно должно сжиматься до исходного положения.
Как это можно достичь?
Ответы
Ответ 1
Добавить распознаватель жестов в контроллер вида.
Добавьте распознаватель жестов в файл заголовка
@interface viewController : UIViewController <UIGestureRecognizerDelegate>{
UITapGestureRecognizer *tap;
BOOL isFullScreen;
CGRect prevFrame;
}
В вашем представленииDidLoad добавьте это:
isFullScreen = false;
tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imgToFullScreen)];
tap.delegate = self;
Добавьте следующий делегат-метод:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
{
BOOL shouldReceiveTouch = YES;
if (gestureRecognizer == tap) {
shouldReceiveTouch = (touch.view == yourImageView);
}
return shouldReceiveTouch;
}
Теперь вам просто нужно реализовать свой метод imgToFullScreen.
Убедитесь, что вы работаете с isFullScreen Bool (полноэкранный режим, если он неверен и возвращается к старому размеру, если это правда)
Метод imgToFullScreen зависит от того, как вы хотите, чтобы изображение стало полноэкранным.
Один из способов:
(это не проверено, но должно работать)
-(void)imgToFullScreen{
if (!isFullScreen) {
[UIView animateWithDuration:0.5 delay:0 options:0 animations:^{
//save previous frame
prevFrame = yourImageView.frame;
[yourImageView setFrame:[[UIScreen mainScreen] bounds]];
}completion:^(BOOL finished){
isFullScreen = true;
}];
return;
} else {
[UIView animateWithDuration:0.5 delay:0 options:0 animations:^{
[yourImageView setFrame:prevFrame];
}completion:^(BOOL finished){
isFullScreen = false;
}];
return;
}
}
Ответ 2
Код из @AzzUrr1, небольшие исправления ошибок (скобки) и tapper реализованы немного иначе.
Работал для меня. Теперь было бы здорово, если бы это было реализовано с помощью scrollView, что пользователь может увеличивать/уменьшать изображение, если изображение больше. Любое предложение?
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UIGestureRecognizerDelegate>{
UITapGestureRecognizer *tap;
BOOL isFullScreen;
CGRect prevFrame;
}
@property (nonatomic, strong) UIImageView *imageView;
@end
ViewController.m
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
isFullScreen = FALSE;
tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imgToFullScreen)];
tap.delegate = self;
self.view.backgroundColor = [UIColor purpleColor];
_imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 300, 200)];
_imageView.contentMode = UIViewContentModeScaleAspectFill;
[_imageView setClipsToBounds:YES];
_imageView.userInteractionEnabled = YES;
_imageView.image = [UIImage imageNamed:@"Muppetshow-2.png"];
UITapGestureRecognizer *tapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imgToFullScreen:)];
tapper.numberOfTapsRequired = 1;
[_imageView addGestureRecognizer:tapper];
[self.view addSubview:_imageView];
}
-(void)imgToFullScreen:(UITapGestureRecognizer*)sender {
if (!isFullScreen) {
[UIView animateWithDuration:0.5 delay:0 options:0 animations:^{
//save previous frame
prevFrame = _imageView.frame;
[_imageView setFrame:[[UIScreen mainScreen] bounds]];
}completion:^(BOOL finished){
isFullScreen = TRUE;
}];
return;
}
else{
[UIView animateWithDuration:0.5 delay:0 options:0 animations:^{
[_imageView setFrame:prevFrame];
}completion:^(BOOL finished){
isFullScreen = FALSE;
}];
return;
}
}
Ответ 3
В итоге я использовал MHFacebookImageViewer. Интеграция проста, без подкласса UIImageView
, а также имеет масштабирование изображения и смещение.
Для этого требуется AFNetworking
(для загрузки большего изображения из URL), вы можете прокомментировать некоторый код (около 10 строк), чтобы удалить эту зависимость. Я могу опубликовать свою бесплатную версию AFNetworking, если кому-то это нужно. Дайте мне знать:)
Ответ 4
Одной из возможных реализаций будет использование модального контроллера представления с UIModalPresentationFullScreen стиль презентации.
Ответ 5
Только что закончил версию в swift, просто загрузите и добавьте в свой проект:
GSSimpleImageView.swift
И использование:
let imageView = GSSimpleImageView(frame: CGRectMake(20, 100, 200, 200))
imageView.image = UIImage(named: "test2.png")
self.view.addSubview(imageView)