2012-09-24 48 views
4

我很努力在繪製到屏幕外緩衝區時讓Image Inset工作。在UIGraphicsBeginImageContextWithOptions中的CGContextDrawImage上忽略UIEdgeInsets

使用resizableImageWithCapInsets:上的UIImage直接setImage:成一個按鈕用於我正常工作:

UIImage * base = [UIImage imageNamed:@"button.png"]; 
UIImage * img = [base resizableImageWithCapInsets:UIEdgeInsetsMake(20,20,20,20)]; 
[self setImage:img forState:UIControlStateNormal]; 

如下圖所示(左是原始縮放,右被縮放與插圖):

Image stretched without ado Image stretched with decent insets

所以,正確的一個很好 - 線的頂部/底部/左/右等距。到現在爲止還挺好。

現在,如果我嘗試用圖像同樣的事情被吸入,然後捕捉到屏幕外緩衝區:

UIImage * base = [UIImage imageNamed:@"button.png"]; 
base = [base resizableImageWithCapInsets:UIEdgeInsetsMake(20,20,20,20)]; 

UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0); 
ctx = UIGraphicsGetCurrentContext(); 

CGContextDrawImage(ctx, CGRectMake(0,0,self.bounds.size.width, 
     self.bounds.size.height), [base CGImage]); 

img = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 
[self setImage:img forState:UIControlStateNormal]; 

我得到以下(再剩下的就是原料比例,右邊是用插圖) :

raw scaling, side bufferscaling with inset, side buffer (WRONG!)

所以這裏似乎忽略了插入。

任何有關這裏發生了什麼問題的建議?在http://people.apache.org/~dirkx/insetSample.zip的全功能示例,以及http://pastebin.com/rm8h6YFV的關鍵代碼。

任何和所有建議表示讚賞。

了Dw

回答

13

我猜想,拉伸UIImages在比Quartz2D更高層次處理,因此使用CGContextDrawImage是行不通的。

您可以嘗試使用-[UIImage drawInRect]來代替。這將繪製到當前的UIGraphics上下文中,這是您在代碼片段中創建的位圖上下文。

相關線上:

[base drawInRect:CGRectMake(0,0,self.bounds.size.width, 
            self.bounds.size.height)]; 
+0

我只是想編輯您所提供的項目,使這一變化解決您的問題。 –

+0

謝謝 - 這的確是現貨。作品可愛的變化(爲將來的參考 - http://pastebin.com/FjZkfb9z是更新的文件/代碼。 –

+0

其實 - 當這樣做與真實圖像(這是一種像視覺混合器上看到illumated按鈕http://www.flickr.com/photos/peterprice/121342192/) - 需要確保東西都旋轉 - 因爲兩個圖層的頂部和底部都有Y原點。 –