Переключить изображение на полный экран на Ipad - PullRequest
1 голос
/ 10 апреля 2011

У меня много проблем с выполнением этой задачи на ipad: когда двойная лента на изображении переключает это изображение в полноэкранный режим, а при двойном касании снова возвращается к исходному экрану, то же самое с помощью сжатия. Я использую UIGestureRecognizer, чтобы попытаться сделать это. Спасибо за вашу помощь.

GesturesViewController.h
#import <UIKit/UIKit.h>

@interface GesturesViewController : UIViewController 
    <UIActionSheetDelegate>{
    IBOutlet UIImageView *imageView;
}

@property (nonatomic, retain) UIImageView *imageView;

@end
GesturesViewController.m
    #import "GesturesViewController.h"
#import "GesturesAppDelegate.h"

@implementation GesturesViewController

@synthesize imageView;


CGRect originalFrame,fullScreenFrame;

BOOL isFullScreenMode;
- (void)viewDidLoad {
    // Loading test image
        imageView.image = [UIImage   imageNamed:@"image1.jpg"];
    //---tap gesture---
    isFullScreenMode = NO;

    originalFrame = CGRectMake(imageView.frame.origin.x,imageView.frame.origin.y,imageView.frame.size.width,imageView.frame.size.height);


    //changes
    fullScreenFrame = CGRectMake(0,0,768,1004);
    UITapGestureRecognizer *tapGesture =
    [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)];

    tapGesture.numberOfTapsRequired = 2;
    [imageView addGestureRecognizer:tapGesture];
    [tapGesture release];

    //---pinch gesture---
    UIPinchGestureRecognizer *pinchGesture = 
    [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)];

    [imageView addGestureRecognizer:pinchGesture];
    [pinchGesture release];   

    [super viewDidLoad];
}

//---handle tap gesture---
-(IBAction) handleTapGesture:(UIGestureRecognizer *) sender {
    // HOW TO ACCOMPLISH THIS PART
    if (isFullScreenMode)
        [imageView setFrame:originalFrame];
    else
        [imageView setFrame:fullScreenFrame];

    [imageView setCenter:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)];
    isFullScreenMode = !isFullScreenMode;
    NSLog(@"Image View : %@",imageView);
}

//---handle pinch gesture---
-(IBAction) handlePinchGesture:(UIGestureRecognizer *) sender { 
    CGFloat factor = [(UIPinchGestureRecognizer *) sender scale];   

    if (sender.state == UIGestureRecognizerStateEnded){
        // HOW TO ACCOMPLISH THIS ---
        if (factor > 1 && !isFullScreenMode) {
            //---pinching in---
            [imageView setFrame:fullScreenFrame];

        } else {
            //---pinching out---
            [imageView setFrame:originalFrame];

        } 
        isFullScreenMode = !isFullScreenMode;
        [imageView setCenter:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)];
    }   
    NSLog(@"Image View : %@",imageView);
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)dealloc {
    [images release];
    [imageView release];
    [super dealloc];
}

@end

Спасибо.

Ответы [ 4 ]

0 голосов
/ 11 апреля 2011
- (void)toggleZoom:(UITapGestureRecognizer *)gestureRecognizer
{
    if (proxyView)
    {
        CGRect frame =
            [proxyView.superview
                convertRect:self.view.frame
                fromView:self.view.window];
        self.view.frame = frame;

        CGRect proxyViewFrame = proxyView.frame;

        [proxyView.superview addSubview:self.view];
        [proxyView removeFromSuperview];
        [proxyView autorelease];
        proxyView = nil;
        self.view.frame = proxyViewFrame;

    }
    else
    {
        proxyView = [[UIView alloc] initWithFrame:self.view.frame];
        proxyView.hidden = YES;
        proxyView.autoresizingMask = self.view.autoresizingMask;
        [self.view.superview addSubview:proxyView];

        CGRect frame =
            [self.view.window
                convertRect:self.view.frame
                fromView:proxyView.superview];
        [self.view.window addSubview:self.view];
        self.view.frame = frame;
        self.view.frame = self.view.window.bounds;

    }


}

Я выбрал только необходимую часть кода ...... его из ZoomingViewController .... Если вы видите его так же, как мы обсуждали ранее ..... но с некоторыми улучшениями......

0 голосов
/ 10 апреля 2011

in

viewDidLoad
originalFrame = imageView.frame;

или

originalFrame = CGRectMake(imageView.frame.origin.x,imageView.frame.origin.y,imageView.frame.size.width,imageView.frame.size.height);

appDelegate <----- получите экземпляр вашего объекта appdelegate, чтобы мы могли получить объект окна ....... </p>

UIWindow *tempWindow = [appDelegate window];
fullScreenFrame = CGRectMake(tempWindow .frame.origin.x,tempWindow .frame.origin.y,tempWindow .frame.size.width,tempWindow.frame.size.height);

// ** в случае, просто установите фрейм imageView - чтобы узнать текущее состояние - будь то его fullScreen или оригинальный кадр, нам нужен флаг........ он должен быть глобальным ... поэтому объявите глобальный флаг .... BOOL isFullScreenMode и инициализируйте его как NO в

viewDidLoad
isFullScreenMode = NO;

в действиях жестов, просто отметьте этоотметьте и напишите следующее ...

if (isFullScreenMode)
        [imageView setFrame:originalFrame];
else
       [imageView setFrame:fullScreenFrame];

isFullScreenMode = !isFullScreenMode;
0 голосов
/ 10 апреля 2011
@implementation ImageFullScreen
@synthesize myImage;

#import "GesturesViewController.h"
#import "GesturesAppDelegate.h"

@implementation GesturesViewController

@synthesize imageView;

CGRect originalFrame,fullScreenFrame;

BOOL isFullScreenMode;
- (void)viewDidLoad {
    // Loading test image
    imageView.image = [UIImage   imageNamed:@"image1.jpg"];
    //---tap gesture---
    isFullScreenMode = NO;

    originalFrame = CGRectMake(imageView.frame.origin.x,imageView.frame.origin.y,imageView.frame.size.width,imageView.frame.size.height);


    //changes
    fullScreenFrame = CGRectMake(0,0,768,1004);
    UITapGestureRecognizer *tapGesture =
    [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)];

    tapGesture.numberOfTapsRequired = 2;
    [imageView addGestureRecognizer:tapGesture];
    [tapGesture release];

    //---pinch gesture---
    UIPinchGestureRecognizer *pinchGesture = 
    [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)];

    [imageView addGestureRecognizer:pinchGesture];
    [pinchGesture release];   

    [super viewDidLoad];
}

//---handle tap gesture---
-(IBAction) handleTapGesture:(UIGestureRecognizer *) sender {
    // HOW TO ACCOMPLISH THIS PART
    if (isFullScreenMode)
        [imageView setFrame:originalFrame];
    else
        [imageView setFrame:fullScreenFrame];

    [imageView setCenter:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)];
    isFullScreenMode = !isFullScreenMode;
    NSLog(@"Image View : %@",imageView);
}

//---handle pinch gesture---
-(IBAction) handlePinchGesture:(UIGestureRecognizer *) sender { 
    CGFloat factor = [(UIPinchGestureRecognizer *) sender scale];   

    if (sender.state == UIGestureRecognizerStateEnded){
        // HOW TO ACCOMPLISH THIS ---
        if (factor > 1 && !isFullScreenMode) {
            //---pinching in---
            [imageView setFrame:fullScreenFrame];

        } else {
            //---pinching out---
            [imageView setFrame:originalFrame];

        } 
        isFullScreenMode = !isFullScreenMode;
        [imageView setCenter:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)];
    }   
    NSLog(@"Image View : %@",imageView);
}
0 голосов
/ 10 апреля 2011

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

you need create two global frames

    CGRect originalFrame, fullScreenFrame;

    //in viewDidLoad initialize these frames... originalFrame with imageView frame and 
fullScreenFrame with the iPad window coordinates........ but remeber this can distort the
 aspect ratio so just calculate the aspect ratio of original image by using its height and
 width and accordingly create the full screen frame for the image....... 

    and just assign these frames in your gesture action.

Спасибо,

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