Soru UIImageView ve UIScrollView yakınlaştırma


Bir çimdikleme çalışması için UIScrollView içinde bir UIPinchGestureRecognizer'a ihtiyacım var mı? Eğer evet ise nasıl yaparım? Ben bir flipboard olan, temelde bir görüntüyü yakınlaştırır ve yakınlaştırma sonra kaydırma yeteneği var uygulamak için çalışıyorum. Bunu nasıl yapabilirim?

GÜNCELLEŞTİRME:

Burada, kaydırma görünümü temsilcisini aramayan bazı kodlar var

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];

23
2018-01-17 08:01


Menşei




Cevaplar:


Tek yapmanız gereken eklemek UIImageView (veya yakınlaştırmak istediğiniz herhangi bir görünüm) UIScrollView.

Senin ayarlamak maximumZoomScale senin üstünde UIScrollView 1.0f'den daha yüksek herhangi bir değere.

Kendinizi delege olarak belirleyin UIScrollView ve geri dön UIImageView viewForZooming delegesi yönteminde.

Bu kadar. Hiçbir tutam jest gerekli, hiçbir şey yok. UIScrollView sizin için yakınlaştırma tutam kolları.


80
2018-01-17 16:33



Evet, hepsini yaptım ama delege çağırılmadı - adit
Aha! Ben maxZoomScale ayarlamadım ve bu yüzden işe yaramadı! Teşekkürler - adit
Ignacio lütfen imageView ve scrollView'daki kısıtlamaları söyler misiniz? Aynısını yaptım ama çalışmıyor. Görüntü görünümüm en boy oranına ayarlandı ve genişlik resim Görünümü çerçevesinden dışarı çıkıyor, bu yüzden resim görünümü çerçevesini ve kaydırma içeriği boyutu genişliğini artırmam gerekiyor. Kaydırma görünümünde yalnızca bir resmim var - Hic Up


Tutam tanıyıcıları olmadan uzun zaman önce özel bir resim görüntüleyici yaptım. UIScrollView üstünde sadece UIImageView. Orada görüntünün bir bağlantısı olan bir dizgeyi geçirirsiniz ve ayrıca bir ilerleme çubuğu vardır. Bu görüntü bittiğinde, görüntü gösterilir. İşte kod:

-(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];
}

Ve başlık dosyası:

@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

Umarım yardımcı olur


14
2018-01-17 08:15



Bu viewForZoomingInScrollView neden hiç çağrılmadığını biliyor musunuz? - adit
@adit inanıyorum UIScrollViewDelegate tarafından denir inanıyorum - Novarg
Bu temelde, zoomingPDFViwer'ın yeniden gözden geçirilmiş bir versiyonudur, görünüşü daha iyidir. @Novarg için bir sorum var. PDF'yi yüklediğimde, bu bir tablo görünümünden bir kaydırma görünümüne indirilirken, ancak ilk kez seçildiğinde kaydırma görünümünü güncellemez, ancak neden ikinci kez çalışır? - Popeye
@mattInman neredeyse zoomingPDFViewer ile aynı olabilir, ben sadece bir sürü kod topladıktan sonra sınıflarımı istediğim gibi oluşturmak için bu kodlardan kullandım. Ve üzgünüm, soruyu anlamadım. Daha spesifik olabilir misiniz lütfen? Ve bu sınıf görüntüleri göstermek için yapıldı (jpg / jpeg / gif / bmp / ​​png / etc.), Bu yüzden PDF'lerle çalışacağından emin değilim. - Novarg
@Novarg Tamam, cevabımı buldum. - Popeye


Swift 2.0 Scrollview Adımlarında Pinch-zoom Görüntüsü (Hızlı 2.0)

1. Görünüm Sınırlarını Kaydırma 

enter image description here

2. ScrollView'de ImageView ekleyin ve Constraints'i ayarlayın 

enter image description here

3. IBOutlets'i al

IBOutlet UIScrollView * bgScrollView;
IBOutlet UIImageView * imageViewOutlet;

4. viewDidLoad Yöntemi

- (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. Görünüm Delege Yöntemi'ni kaydır

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return imageViewOutlet;
}

14
2018-02-25 13:50





Sanırım bu cevap gereksiz olabilir ama @ad ile benzer problemler yaşadım ve bunu çok basit bir şekilde çözdüm (bence) ve benzer zorlukları olan biri bunu kullanabilir:

- (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;
} 

Sorunum çok basit bir şekilde eklemeyi unutmuştum self.myScrollView.delegate = self;sorunumun sebebi de buydu. Bu basit sorunu çözmek için beni sonsuza kadar sürdü, sanırım tüm ağaçlar için forrest görmedim :-)


9
2017-08-03 21:06





Zooming PDF görüntüleyicimi bir UIScrollView uygulamasında geliştirdiğimde, Telefonda çalışırken, telefonun bir parçası olarak yakınlaştırma uygulamasının zaten yapıldığını öğrendim. Ama buna bir göz atabilirsin. http://developer.apple.com/library/ios/#samplecode/ZoomingPDFViewer/Introduction/Intro.html Bu, yakınlaştırma için işlevselliği uygulamaya çalışan bir örnek kod parçasıdır, bu beni başlatmak istiyorum.


2
2018-01-17 08:15



Aslında ona baktım ve bu, viewForZoomingInScrollView adında bir temsilciye ihtiyacım olacağını söylüyor, ancak bu, kendimi zaten kendime delege ayarlamasına rağmen - adit
@Novarg, UIScrollViewDelegate tarafından çağrıldığından, .h dosyasında olduğu gibi <UIScrollViewDelegate> eklediğinizden emin olun. - Popeye