2011-09-05 54 views
5

我的UIScrollView填充了大量內容,然後用「setZoomScale:animated」放大,使其適合滾動視圖框架。視圖顯示適當縮小,並正確定位在滾動視圖中。但是,用戶可以在內容之外滾動(scrollview背景顏色顯示)。他似乎可以滾動到原始內容大小(就像內容沒有被縮小一樣)。 奇怪的是,在用戶第一次手動放大後,一切正常,並且滾動視圖再次被限制爲內容大小。UIScrollView在初始縮放後滾動得太遠

我搜索了網頁,並通過了蘋果文檔和示例,但找不到任何人有同樣的問題。蘋果公司的例子似乎和我一樣。

我的內容是一個派生自UIView的自定義視圖,其CALayer被CATiledLayer替換(如Apple示例中所示)。我在drawLayer:inContext:中自己畫圖。

下面是從MyScrollViewController的代碼片段:

- (void)loadView { 
    CGRect frame = [UIScreen mainScreen].applicationFrame; 
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:frame]; 
    scrollView.maximumZoomScale=1.0; 
    scrollView.delegate = self; 

    ... setup theContentView ... 

    scrollView.contentSize = theContentView.bounds.size; 
    scrollView.contentInset = UIEdgeInsetsMake(20, 20, 20, 20); 
    [scrollView addSubview:theContentView]; 
    self.view = scrollView; 

    double zoomScale = 0.5; // hardcoded for testing 
    [scrollView setZoomScale:zoomScale animated:NO]; 
NSLog(@"zoomscale=%g contentview=%@ contentsize=%@", zoomScale, NSStringFromCGSize(theContentView.bounds.size), NSStringFromCGSize(scrollView.contentSize)); 

    [scrollView release]; 
} 

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

該聲明的NSLog顯示了正確設置contentSize和zoomscale ...

希望有一些東西很明顯,我很想念...

+0

有沒有人爲此提供解決方案?我有同樣的問題,只是相反。我的滾動查看是很小,以顯示包含的圖像(我不能滾動到圖像的底部)但一旦放大一切都很好。 – Maverick1st

+1

我結束了在下一個runloop(而不是直接從loadView)設置zoomScale,它工作:「[self performSelector:@selector(initialZoom)withObject:nil afterDelay:0];」。但我重寫了很多其他內容,所以我不確定這是否是唯一需要的。 – fishinear

+0

我終於有了同樣的想法,它完美的工作。在viewDidAppear中設置縮放比例的一個好處是,用戶看到動畫縮放並因此知道,他所看到的圖像是可縮放的:) – Maverick1st

回答

3

我結束了(直接的loadView代替),其工作設置zoomScale在下runloop:

- (void) loadView { 
    CGRect frame = [UIScreen mainScreen].applicationFrame; 
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:frame]; 
    scrollView.maximumZoomScale=1.0; 
    scrollView.delegate = self; 

    ... setup theContentView ... 

    scrollView.contentSize = theContentView.bounds.size; 
    scrollView.contentInset = UIEdgeInsetsMake(20, 20, 20, 20); 
    [scrollView addSubview:theContentView]; 
    self.view = scrollView; 

    // set the zoom level on the next runloop invocation 
    [self performSelector:@selector(initialZoom) withObject:nil afterDelay:0]; 

    [scrollView release]; 
} 

- (void) initialZoom { 
    double zoomScale = 0.5; // hardcoded for testing 
    UIScrollView *scrollView = (UIScrollView *) self.view; 
    [scrollView setZoomScale:zoomScale animated:NO]; 
} 

另一種可能性,通過Maverick1st建議,是設置從viewDidAppear,而不是的loadView的zoomscale 。該方法具有附加的優點,即它顯示縮放的動畫,向用戶指示視圖以縮放狀態開始。

- (void) viewDidAppear { 
    double zoomScale = 0.5; // hardcoded for testing 
    UIScrollView *scrollView = (UIScrollView *) self.view; 
    [scrollView setZoomScale:zoomScale animated:YES]; 
} 
1

我是新來的,但你可以嘗試裁剪子視圖。我使用界面構建器創建了一個滾動視圖,並且在屬性檢查器中有一個複選框剪輯子視圖,所以我認爲你應該這樣做,只能以編程方式。希望有所幫助。