2012-02-21 4 views
5

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

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

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

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

-(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 или даже как его искать, чтобы выяснить, может ли это решить это или нет.

ответ

5

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

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

@interface scrollViewController : UIViewController <UIScrollViewDelegate>{ 

     float oldScale; 

     IBOutlet UIScrollView *scrollView; 
     IBOutlet UIImageView *image; 
} 

@end 

и просто соединить изображение с UIImageView, который имеет фотографию, которую вы хотите, чтобы увеличивать и уменьшать масштаб и находится внутри вашего Scrollview. затем подключите scrollview к вашему 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 

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

+0

Спасибо @Mona. Я также столкнулся с тем же вышеизложенным вопросом. Меня устраивает. :) – iKT

1

Вот как я реализую вид прокрутки для прокрутки вокруг большого изображения в 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

не работает должным образом – Mona

+1

Просто убедитесь, что вы работаете в iOS 5? И ваш контроллер просмотра является делегатом ? – atreat

+0

Да на оба вопроса – Mona

1

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

[self.imageView setUserInteractionEnabled:YES]; 
0

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

func viewDidLoad() { scrollView.delegate = self } 

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

Смежные вопросы