2012-06-19 4 views
1

Я получаю ошибку Exc_Bad_Access в основном при попытке прокрутить мой UIScrollView. Эта программа проста. У меня есть UIViewController, добавленный в AppDelegate. Тогда вот код в ViewController. Это отлично работает для прокрутки, но как только я добавляю tmpScrollView.delegate = self. Программа не будет прокручивать или увеличивать масштаб и дает мне ошибку Exc_Bad_Access при попытке масштабирования.UIScrollView Zooming Crashes App с Exc_Bad_Access

@interface MainViewController : UIViewController &ltUIScrollViewDelegate> 
@property (nonatomic,retain) UIScrollView *tmpScrollView; 
@property (nonatomic,retain) UIView *containerView; 
@end 

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

// Do any additional setup after loading the view. 
tmpScrollView = [[UIScrollView alloc] initWithFrame:self.view.frame]; 
tmpScrollView.delegate = self; 
[self.view addSubview:tmpScrollView]; 

// Set up the container view to hold our custom view hierarchy 
CGSize containerSize = CGSizeMake(640.0f, 640.0f); 
self.containerView = [[UIView alloc] initWithFrame:(CGRect){.origin=CGPointMake(0.0f, 0.0f), .size=containerSize}]; 
[self.tmpScrollView addSubview:self.containerView]; 

// Set up custom view hierarchy 
UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 640.0f, 80.0f)]; 
redView.backgroundColor = [UIColor redColor]; 
[self.containerView addSubview:redView]; 

UIView *blueView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 560.0f, 640.0f, 80.0f)]; 
blueView.backgroundColor = [UIColor blueColor]; 
[self.containerView addSubview:blueView]; 

UIView *greenView = [[UIView alloc] initWithFrame:CGRectMake(160.0f, 160.0f, 320.0f, 320.0f)]; 
greenView.backgroundColor = [UIColor greenColor]; 
[self.containerView addSubview:greenView]; 

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"slow.png"]]; 
imageView.center = CGPointMake(320.0f, 320.0f); 
[self.containerView addSubview:imageView]; 

//Tell the scroll view the size of the contents 
self.tmpScrollView.contentSize = containerSize; 
} 

-(void)viewWillAppear:(BOOL)animated 
{ 
NSLog(@"Will Appear"); 
[super viewWillAppear:animated]; 

// Set up the minimum & maximum zoom scales 
CGRect scrollViewFrame = self.tmpScrollView.frame; 
CGFloat scaleWidth = scrollViewFrame.size.width/self.tmpScrollView.contentSize.width; 
CGFloat scaleHeight = scrollViewFrame.size.height/self.tmpScrollView.contentSize.height; 
CGFloat minScale = MIN(scaleWidth, scaleHeight); 

self.tmpScrollView.minimumZoomScale = minScale; 
self.tmpScrollView.maximumZoomScale = 1.0f; 
self.tmpScrollView.zoomScale = minScale; 

//***** Here is the line for setting the delegate 
self.tmpScrollView.delegate = self; 

[self centerScrollViewContents]; 
} 


-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale 
{ 
NSLog(@"End Zoom"); 
} 

-(UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView { 
// Return the view that we want to zoom 
return self.containerView; 
} 

-(void)scrollViewDidZoom:(UIScrollView *)scrollView { 
// The scroll view has zoomed, so we need to re-center the contents 
[self centerScrollViewContents]; 
} 
@end 

Спасибо за любую помощь. Это сводит меня с ума в течение дня теперь ...

Edit: Добавление centerScrollViewContens тоже:

- (void)centerScrollViewContents { 
    CGSize boundsSize = self.tmpScrollView.bounds.size; 
    CGRect contentsFrame = self.containerView.frame; 

    if (contentsFrame.size.width < boundsSize.width) { 
     contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width)/2.0f; 
    } else { 
     contentsFrame.origin.x = 0.0f; 
    } 

    if (contentsFrame.size.height < boundsSize.height) { 
     contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height)/2.0f; 
    } else { 
     contentsFrame.origin.y = 0.0f; 
    } 

    self.containerView.frame = contentsFrame; 
} 
+0

Некоторые искали из ошибки в первой строке должно быть: UIViewController Dhruv

+0

& lt; html-код для <. Он не показывался, когда я изначально записывал его в переполнение стека, когда использовал <***>. Фактический код, который у меня есть, - это Jomnipotent17

ответ

0

Независимо от кода вы предоставили работает нормально на моем end.May там может быть какая-то проблема в вашем методе «centerScrollViewContents». Можете ли вы отправить код для этого метода?

+0

okay, добавлено centerScrollViewContents – Jomnipotent17

+0

Его все еще работает в моем случае и дает результат, как красный вид выше, а затем зеленый вид в середине, а затем синий вид на последнем и сером фоне. Попробуйте «очистить» ваш проект и сбросить настройки симулятора, а затем запустить его снова. Или лучше создать новый проект со всем указанным выше кодом и запустить его. Он определенно будет работать. –

+0

Да, я тоже вижу эти взгляды. Но попробуйте увеличить масштаб с помощью клавиши alt. Когда я это сделаю. Он бомбит Exc_Bad_Access – Jomnipotent17

0

Вам нужно разработать минимальную шкалу масштабирования для прокрутки. Масштаб масштаба означает, что содержимое отображается в нормальном размере. Шкала масштабирования ниже единицы показывает, что контент уменьшен, а масштаб масштабирования больше одного показывает, что контент увеличен. Чтобы получить минимальную масштабную шкалу, вы подсчитываете, как далеко вы должны будете уменьшить масштаб, чтобы изображение плотно прилегало к ваши рамки просмотра прокрутки основаны на его ширине. Затем вы делаете то же самое на основе высоты изображения. Минимум этих двух результирующих масштабных масштабов будет минимальной шкалой масштабирования прокрутки. Это дает вам масштаб масштаба, где вы можете увидеть все изображение, когда оно полностью уменьшено.

Swift:

let scrollViewFrame = scrollView.frame 
let scaleWidth = scrollViewFrame.size.width/scrollView.contentSize.width 
let scaleHeight = scrollViewFrame.size.height/scrollView.contentSize.height 
let minScale = min(scaleWidth, scaleHeight); 
scrollView.minimumZoomScale = minScale; 

Objective-C

CGFloat scrollViewFrame = scrollView.frame 
CGFloat scaleWidth = scrollViewFrame.size.width/scrollView.contentSize.width 
CGFloat scaleHeight = scrollViewFrame.size.height/scrollView.contentSize.height 
CGFloat minScale = min(scaleWidth, scaleHeight); 
scrollView.minimumZoomScale = minScale; 

Из других проектов и личного опыта делают тяжелую GPU на прошивкой (бесконечный свиток, максимальный размер растрового изображения, и т.д.), я заметил, что каждое устройство имеет собственный порог. Для прошлых проектов, я также жёстко ниже значения как minimumZoomScale для предотвращения аварий:

scale : 
     { 
       iPad : { 
        min : 0.8 
       , max : 1.6 
      } 
      , iPhone : { 
        min : 0.25 
       , max : 1.6 
      } 
      , iPhone6 : { 
        min : 0.3333 
       , max : 1.6 
      } 
      , iPhoneResizable: { 
        min : 1 
       , max : 1.6 
      } 
     } 

Большой учебник для начинающих: http://www.raywenderlich.com/76436/use-uiscrollview-scroll-zoom-content-swift