2012-01-17 7 views
23

Действительно ли мне нужен UIPinchGestureRecognizer внутри UIScrollView для работы с пинчем? Если да, как мне это сделать? Я пытаюсь реализовать, что такое флип-трек, где он в основном масштабирует изображение и имеет возможность прокрутки после масштабирования. Как это сделать?UIImageView и масштабирование UIScrollView

UPDATE:

Вот код, который у меня есть, не вызывает вид прокрутки делегат

CGRect imgFrame; 
imgFrame.size.width = originalImageSize.width; 
imgFrame.size.height = originalImageSize.height; 
imgFrame.origin.x = imageOriginPoint.x; 
imgFrame.origin.y = imageOriginPoint.y; 

NSData *data = [request responseData]; 
UIImage * image = [UIImage imageWithData:data]; 
imageView = [[UIImageView alloc] initWithImage:image]; 
[imageView setUserInteractionEnabled:YES]; 
[imageView setBackgroundColor:[UIColor clearColor]]; 
[imageView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight]; 
[imageView setFrame:CGRectMake(0, 0, imgFrame.size.width, imgFrame.size.height)]; 

UIScrollView * imgScrollView = [[UIScrollView alloc] initWithFrame:imageView.frame]; 
imgScrollView.delegate = self; 
imgScrollView.showsVerticalScrollIndicator = NO; 
imgScrollView.showsHorizontalScrollIndicator = NO; 
[imgScrollView setScrollEnabled:YES]; 
[imgScrollView setClipsToBounds:YES]; 
[imgScrollView addSubview:imageView]; 
[imgScrollView setBackgroundColor:[UIColor blueColor]]; 
[imgScrollView setMaximumZoomScale:1.0]; 

ответ

79

Все, что вам нужно сделать, это добавить UIImageView (или любой вид вы хотите, чтобы увеличить) внутри вашего UIScrollView.

Установите maximumZoomScale на свой UIScrollView на любое значение выше 1.0f.

Установите себя как делегат вашего UIScrollView и верните UIImageView в режиме делегата viewForzooming.

Все. Никаких жестких усилий не требовалось, ничего. UIScrollView Ручки масштабирования масштабирования для вас.

+0

да, я сделал все это, но делегат не называется – adit

+0

ага! Я не установил maxZoomScale, и поэтому он не сработал! спасибо – adit

+0

Ignacio, пожалуйста, можете ли вы указать ограничения на imageView и scrollView. Я сделал то же самое, но он не работает. В моем представлении изображения установлено, что размер аспект заполняется, а ширина выходит за пределы рамки изображения. Мне нужно увеличить рамку просмотра изображения, а также ширину размера содержимого прокрутки. У меня есть только одно изображение в моем представлении прокрутки –

2

Когда я разрабатывал мой зритель Zooming PDF в UIScrollView я узнал, что, когда запуская его на телефоне, на самом деле оно уже имеет масштабирование, реализованное как часть телефона. Но вы могли бы взглянуть на это, http://developer.apple.com/library/ios/#samplecode/ZoomingPDFViewer/Introduction/Intro.html это кусок образца кода, который пытается реализовать функциональность масштабирования, это желание, и я начал.

+0

я на самом деле смотрел на это, и он говорит, что мне нужно будет делегатом под названием viewForZoomingInScrollView, однако это никогда не называют, хотя я уже установить делегат к себе – adit

+1

Как @Novarg hassaid он вызывается с помощью UIScrollViewDelegate так в вашем .h файле обязательно добавьте Popeye

+0

Я добавил это, и он все еще не называется – adit

14

Я сделал пользовательский просмотрщик изображений совсем недавно без распознавателей щепотки. Просто UIImageView поверх UIScrollView. Там вы передаете строку со ссылкой на изображение, и она также имеет индикатор выполнения. Как только это изображение будет завершено, изображение будет показано. Вот код:

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return self.theImageView; 
} 

- (CGRect)centeredFrameForScrollView:(UIScrollView *)scroll andUIView:(UIView *)rView { 
    CGSize boundsSize = scroll.bounds.size; 
    CGRect frameToCenter = rView.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; 
    } 
    return frameToCenter; 
} 

-(void)scrollViewDidZoom:(UIScrollView *)scrollView 
{ 
    self.theImageView.frame = [self centeredFrameForScrollView:self.theScrollView andUIView:self.theImageView];        
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    [self.resourceData setLength:0]; 
    self.filesize = [NSNumber numberWithLongLong:[response expectedContentLength]]; 
} 

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [self.resourceData appendData:data]; 
    NSNumber *resourceLength = [NSNumber numberWithUnsignedInteger:[self.resourceData length]]; 
    self.progressBar.progress = [resourceLength floatValue]/[self.filesize floatValue]; 
} 

-(void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    self.theImage = [[UIImage alloc]initWithData:resourceData]; 
    self.theImageView.frame = CGRectMake(0, 0, self.theImage.size.width, self.theImage.size.height); 
    self.theImageView.image = self.theImage; 
    self.theScrollView.minimumZoomScale = self.theScrollView.frame.size.width/self.theImageView.frame.size.width; 
    self.theScrollView.maximumZoomScale = 2.0; 
    [self.theScrollView setZoomScale:self.theScrollView.minimumZoomScale]; 
    self.theScrollView.contentSize = self.theImageView.frame.size; 
    self.theLabel.hidden = YES; 
    self.progressBar.hidden = YES; 
} 

-(void)setImageInImageView 
{ 
    NSURLRequest *req = [[NSURLRequest alloc]initWithURL:[NSURL URLWithString:self.imageLink]]; 
    NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:req delegate:self]; 
    if (conn) 
    { 
    self.resourceData = [NSMutableData data]; 
    } 
    else 
    { 
    NSLog(@"Connection failed: IMageViewerViewController"); 
    } 
} 

-(void)loadView 
{ 
    self.filesize = [[NSNumber alloc]init]; 
    self.progressBar = [[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleBar]; 
    self.progressBar.frame = CGRectMake(20, 240, 280, 40); 
    [self.progressBar setProgress:0.0]; 
    self.theImageView = [[[UIImageView alloc]initWithFrame:[[UIScreen mainScreen]applicationFrame]]autorelease]; 
    self.theScrollView = [[[UIScrollView alloc]initWithFrame:[[UIScreen mainScreen]applicationFrame]]autorelease]; 
    self.theScrollView.delegate = self; 
    [self.theScrollView addSubview:self.theImageView]; 
    self.view = self.theScrollView; 
    self.theLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 200, 320, 40)]; 
    self.theLabel.font = [UIFont boldSystemFontOfSize:15.0f]; 
    self.theLabel.text = @"Please wait, file is being downloaded"; 
    self.theLabel.textAlignment = UITextAlignmentCenter; 
    self.theLabel.hidden = NO; 
    [self.view addSubview:self.progressBar]; 
    [self.view bringSubviewToFront:self.progressBar]; 
    [self.view addSubview:self.theLabel]; 
    [self.view bringSubviewToFront:self. theLabel]; 
    [self performSelectorOnMainThread:@selector(setImageInImageView) withObject:nil waitUntilDone:NO]; 
} 

И заголовочный файл:

@interface ImageViewerViewController : UIViewController<UIScrollViewDelegate, NSURLConnectionDelegate, NSURLConnectionDataDelegate> 

@property (nonatomic, retain) IBOutlet UIImageView *theImageView; 
@property (nonatomic, retain) IBOutlet UIScrollView *theScrollView; 
@property (nonatomic, retain) NSString *imageLink; 
@property (nonatomic, retain) UIImage *theImage; 
@property (nonatomic, retain) UILabel *theLabel; 
@property (nonatomic, retain) UIProgressView *progressBar; 
@property (nonatomic, retain) NSMutableData *resourceData; 
@property (nonatomic, retain) NSNumber *filesize; 
@end 

Надеется, что это помогает

+0

Знаете ли вы, почему этот viewForZoomingInScrollView никогда не называется? – adit

+0

@adit это вызвано UIScrollViewDelegate, я считаю, – Novarg

+0

@adit это сработало? Или у вас есть другие вопросы? – Novarg

9

Я думаю, этот ответ может оказаться ненужным, но у меня были подобные проблемы, как @adit и решить его в очень простой способ (я думаю), и, возможно, кто-то с подобными проблемами могут использовать:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.view.backgroundColor = [UIColor yellowColor]; 

    UIImage *imageToLoad = [UIImage imageNamed:@"background_green"]; 

    self.myImageView = [[UIImageView alloc]initWithImage:imageToLoad]; 
    self.myScrollView = [[UIScrollView alloc]initWithFrame:self.view.bounds]; 
    [self.myScrollView addSubview:self.myImageView]; 
    self.myScrollView.contentSize = self.myImageView.bounds.size; 
    self.myScrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite; 
    self.myScrollView.minimumZoomScale = 0.3f; 
    self.myScrollView.maximumZoomScale = 3.0f; 
    self.myScrollView.delegate = self; 
    [self.view addSubview:self.myScrollView]; 
} 

- (UIView *) viewForZoomingInScrollView:(UIScrollView *)scrollView { 
    NSLog(@"viewForZoomingInScrollView"); 
    return self.myImageView; 
} 

Мои проблема была очень простой, я забыл добавить self.myScrollView.delegate = self;, из-за чего у меня были проблемы. Он взял меня навсегда, чтобы понять, что простая проблема, я думаю, я не видел Форрест для всех деревьев :-)

13

Swift 2,0 Пинч-зум изображения в Scrollview Steps (Swift 2.0)

1. Scroll View Ограничения

enter image description here

2.Добавить ImageView В ScrollView и установите Constraints

enter image description here

3. Возьмите IBOutlets

IBOutlet UIScrollView * bgScrollView; 
IBOutlet UIImageView * imageViewOutlet; 

4. viewDidLoad Метод

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    float minScale=bgScrollView.frame.size.width/imageViewOutlet.frame.size.width; 
    bgScrollView.minimumZoomScale = minScale; 
    bgScrollView.maximumZoomScale = 3.0; 
    bgScrollView.contentSize = imageViewOutlet.frame.size; 
    bgScrollView.delegate = self; 
} 

5. Scroll View Делегат Metho d

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return imageViewOutlet; 
} 
Смежные вопросы