2012-05-04 54 views
1

我把一個UIImageView在一個UIScrollView,並試圖控制圖像,使它在縮放後的scrollview居中。我不確定最好的方法來做到這一點。UIView UIScrollview - 框架,邊界,中心混淆

蘋果文檔告訴我們不要使用frame屬性:「警告如果transform屬性不是標識轉換,則此屬性的值是未定義的,因此應該忽略。」所以我用試圖在UIViewController子類,其廈門國際銀行包含以下內容的滾動視圖和包含的ImageView:

scrollView.bounds = 
    CGRectMake 
    (scrollView.contentSize.width/2 - scrollView.center.x, 
    scrollView.contentSize.height/2 - scrollView.center.y, 
    scrollView.bounds.size.width, 
    scrollView.bounds.size.height); 

containedView.center =  
    CGPointMake 
    (containedView.bounds.size.width*scrollView.zoomScale/2, 
    containedView.bounds.size.height*scrollView.zoomScale/2); 

這工作準確地在containedView的寬度和高度比滾動型較大,並將意見,隨後的滾動將把你完全帶到包含視圖的邊緣。然而,當圖像的任何一個尺寸小於scrollView的寬度和高度時,圖像被磁性吸引到屏幕的左上角。在iPad模擬器(僅限於)圖像縮小到最小縮放大小時,它會鎖定到屏幕中心。磁性吸引力非常平滑,就好像UI中的某些東西在圖像居中後重寫我的代碼一樣。它看起來有點像CALayer contentsGravity(kCAGravityTopLeft)的東西,也許?

蘋果違背自己的意見他們的代碼示例,photoScroller中(在UIScrollView中的一個子類):

// center the image as it becomes smaller than the size of the screen 

CGSize boundsSize = self.bounds.size; 
CGRect frameToCenter = imageView.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; 

imageView.frame = frameToCenter; 

這種方法確實在圖像較小中心的一個更好的工作,但是當我試穿一下我的項目引入了一些不一致的地方。例如,對於scrollView.bounces = NO,其高度小於scrollView的高度但寬度較大(因此可以從左向右滾動)的水平圖像將向左滾動比它應該的更大滾動到右邊,它會在圖像的邊緣正確停止,但如果scrollView.bounces = YES,則它會從邊緣彈起,因此圖像總是在左邊裁剪)當圖像的尺寸大於其包含的滾動視圖這個問題突出而且整個結果都被打破了,鑑於蘋果的文檔化建議,這並不令人驚訝。

我已經搜索了論壇,無法在此找到太多評論。我錯過了真正明顯的東西嗎?

回答

0

您似乎沒有使用transform屬性,因此您可以忽略有關使用transform屬性時未使用frame屬性的警告。繼續使用框架屬性,就像Apple(和我們其他人)一樣。

+0

該方法由scrollViewDidZoom在放大和縮小時調用 - 因此轉換不再是標識轉換?無論如何,上面提到的框架引入了這種滾動故障。當我NSLog每個算法使用的數字,他們似乎是相同的,所以我覺得它有點神祕 – foundry

+0

更準確地說,身份轉換保持不變的scrollView但變焦改變它的imageView。所以我可以使用scrollViews的框架,但我沒有用。 – foundry

+0

我在設置算法將圖像導入滾動視圖時首先發現了這個小故障。我將它們設置爲'縱向填充'滾動視圖,並注意到圖像不會總是正確導入,即使使用相同的圖像,有時也會發生任意大小的調整。我停止使用框架屬性,問題消失(但我獲得了這個問題來彌補它!) – foundry