2011-07-10 37 views
135

我試圖用UIImageView以固定大小(100x100)繪製一些縮略圖圖像。我已將圖像視圖的框架大小設置爲100x100,並將contentMode設置爲UIViewContentModeScaleAspectFillUIViewContentModeScaleAspectFill not clipping

我的理解是,這應該會導致圖像以我設置的大小繪製,並且圖像將填充圖像的區域,並剪裁圖像中超出爲圖像設置的大小的任何部分視圖。但是,圖像仍然比我爲它設置的100x100大小更大或更小。

如果我將contentMode設置爲UIviewContentModeScaleToFill,則圖像精確地繪製爲100x100,但它會扭曲以適合這些尺寸。任何想法爲什麼方面填充不按預期裁剪?

這裏是我的代碼:

_photoView = [[UIImageView alloc] initWithImage:photoImage]; 
_photoView.contentMode = UIViewContentModeScaleAspectFill; 
[self addSubview:_photoView]; 

CGRect photoFrame = _photoView.frame; 
photoFrame.size = CGSizeMake(100, 100); 
_photoView.frame = photoFrame; 

爲了更好地說明,這裏是我所看到的屏幕截圖。綠色方塊是UIView,其中包含我正在處理的UIImageView。我已將背景顏色設置爲綠色,並將視圖的框架設置爲100x100。作爲測試,UIImageViews大小爲50x50。正如你所看到的,當使用...AspectFill時,圖像的大小不是50x50,在某些情況下會偏離我想要的位置。使用...ScaleToFill時,它們的尺寸正確,但圖像失真。

Screenshot illustrating problem

回答

337

你能嘗試設置剪輯範圍

[_photoview setClipsToBounds:YES]; 
在情節提要/ XIB

或者直接,如果你可以:

enter image description here

+10

這就是它 - 感謝。 (我添加了上面的屏幕截圖,以便更好地顯示我所看到的內容,更多的例子是否有其他人遇到此問題。) –

+3

在InterfaceBuilder中,將其重命名爲「Clips subviews」(注意:在這種情況下, t clib「子視圖」,名稱是錯誤的:它剪輯SELF和子視圖) – Adam

+3

在NIB文件中選中「剪輯子視圖」選項也會執行相同的操作。乾杯。 – codeburn

8

如果你想擴展您的知識有一篇關於iOS UIView stack is rendered的文章。還有關於whole drawing pipeline的更深入的文章。

總結:

  1. 光柵化 - 所有視圖的內容被光柵化(拉伸或離屏像素緩衝器)中座標視圖的邊界的空間中。這可以是圖像數據或自定義繪圖(即drawRect:),但是子視圖內容。這種柵格化考慮了contentMode屬性。

    放棄視圖邊界外的任何內容。

  2. 構圖 - 從子視圖到超級視圖合成結果(彼此重疊)。這使用子視圖的框架屬性。

    如果clipsToBounds屬性爲YES上的超級查看,那麼它將丟棄子視圖內容超出其界限。

+0

這個,謝謝!最後解釋一下:D –

0

我subviewes進行調整,我意識到這是因爲廈門國際銀行有自動佈局設置: enter image description here

2

有同樣的問題,它是由滴答「剪輯子視圖」解決。

圖片在故事板預覽中的所有視圖(3.5,4,4.7,5.5,ipad)正確顯示,但不在模擬器中顯示。

當我勾選「Clip Subviews」後,問題就解決了。 :)

1

直接在Storyboard/Xib中檢查「Clip subviews」也適用於我。 enter image description here

0

如果一切都失敗了,

做剪輯以viewDidLayoutSubviews方法界限。

例子:

override func viewDidLayoutSubviews() { 

    imageProfile.layer.cornerRadius = imageProfile.bounds.size.width/2 
    imageProfile.clipsToBounds = true 
    imageProfile.layer.masksToBounds = true 
}