uiscrollview увеличение и уменьшение не работает должным образом - PullRequest
5 голосов
/ 21 февраля 2012

У меня есть uiscrollview, и внутри него есть uiimageview.Я хочу, чтобы раньше можно было увеличивать изображение, так как оно большое.скроллвью нужно только прокручивать вертикально, а не горизонтально.

перед добавлением эффекта масштабирования у меня был следующий код, и он работал, как я хотел,

-(void)viewDidLoad
{
[scrollView setScrollEnabled:YES];
[scrollView setContentSize:CGSizeMake(320, 1690)];
}

Итак, я провел небольшое исследование и в итоге получил следующий код, чтобы включить масштабирование и масштабированиеout,

-(void)viewDidLoad
{
scrollView.scrollEnabled = YES;

[scrollView setContentSize:CGSizeMake(320, 1690)];
scrollView.delegate = self;
//    scrollView.contentSize = instImage.frame.size;
scrollView.minimumZoomScale = scrollView.frame.size.width / instImage.frame.size.width;
scrollView.maximumZoomScale = 2.0;
[scrollView setZoomScale:scrollView.minimumZoomScale];
[[NSRunLoop currentRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate distantFuture]];

 }


 - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {

return instImage;
}


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

return frameToCenter;
 }


 - (void)scrollViewDidZoom:(UIScrollView *)scrollV {

instImage.frame = [self centeredFrameForScrollView:scrollV andUIView:instImage];;
 }

Теперь у меня есть следующие проблемы, и я не могу понять, что не так,

  1. , когда представление только что загружено, прежде чем зажимать представление прокруткине прокручивается полностью до конца изображения.

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

  3. , когда я уменьшаю масштаб, все останавливается.Вы не можете увеличивать или уменьшать масштаб, он даже больше не прокручивается.полностью заблокирован

Я сделал несколько исследований и нашел следующий пост.https://stackoverflow.com/a/6384834/1103257

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

Ответы [ 4 ]

5 голосов
/ 04 апреля 2012

Я наконец получил это.Это решение отлично работает!

в вашем файле .h

@interface scrollViewController : UIViewController <UIScrollViewDelegate>{

      float oldScale;

      IBOutlet UIScrollView *scrollView;
      IBOutlet UIImageView  *image;
}

@end

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

в вашем файле .m

@implementation scrollViewController


-(void)viewDidLoad
{
[super viewDidLoad];

scrollView.scrollEnabled = YES;
scrollView.minimumZoomScale=1.0;
scrollView.maximumZoomScale=4.0;
[scrollView setContentSize:CGSizeMake(320, 1700)];
scrollView.delegate=self;

 }

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

 - (void)scrollViewDidEndZooming:(UIScrollView *)scrollV withView:(UIView *)view atScale:(float)scale
 {
     [scrollView setContentSize:CGSizeMake(scale*320, scale*1700)];
 }

  @end

надеюсь, это поможет.

1 голос
/ 15 ноября 2012

Та же проблема, но есть простой обходной путь, просто включите режим просмотра изображения для взаимодействия с пользователем:

[self.imageView setUserInteractionEnabled:YES];
1 голос
/ 21 февраля 2012

Вот как я реализую представление прокрутки для прокрутки большого изображения в viewDidLoad

UIImage *img = [UIImage imageNamed:@"image_name.png"];
largeImageView = [[UIImageView alloc] initWithImage:img];

[self.view insertSubview: largeImageView atIndex:0];
[(UIScrollView *)self.view setContentSize:[img size]];
[(UIScrollView *)self.view setMaximumZoomScale:2.2];
[(UIScrollView *)self.view setMinimumZoomScale:0.3];
[(UIScrollView *)self.view setCanCancelContentTouches:YES];
[(UIScrollView *)self.view setBounces:YES];
[mapImageView setUserInteractionEnabled:YES];

Тогда у меня также есть метод viewForZoomingInScrollView:

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

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

0 голосов
/ 12 мая 2017

Проблема для меня заключалась в том, что я использовал автоматическую разметку, а он не устанавливал делегат масштабирования для UIScrollView.Я использовал пользовательский UIViewController, который также был UIScrollViewDelegate.Я обнаружил, что вы можете либо в кодовом наборе делегата:

func viewDidLoad() { scrollView.delegate = self }

Или в раскадровке установить делегата, выбрав UIScrolView, и в инспекторе соединений перетащите делегат, чтобы он указывал на UIViewController.

...