en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

10.21.2011

使用路徑 Path 對 UIView 進行切割剪裁

 

對 UIView 切割,其實就是設定它的 Bounds,好讓 UIView 的內容限制在 Bounds 中,之前已經介紹過透過改變 Frame 或 Bounds 大小的方式來切割影像的方法,本篇就採用另一種以設定路徑的方式對 UIView 進行切割,其程式碼如下。

//取得以影像位基準的的中心點坐標
CGPoint center = CGPointMake(imageView.frame.size.width / 2, imageView.frame.size.height / 2);

//設定一個bounds
CGRect bounds = imageView.frame;

//設定參考範圍
UIGraphicsBeginImageContext(bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();

//建立並設定路徑
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, center.x - 70, center.y - 100);
CGPathAddLineToPoint(path, NULL, center.x + 70, center.y - 100);
CGPathAddLineToPoint(path, NULL, center.x + 120, center.y);
CGPathAddLineToPoint(path, NULL, center.x + 70, center.y + 100);
CGPathAddLineToPoint(path, NULL, center.x - 70, center.y + 100);
CGPathAddLineToPoint(path, NULL, center.x - 120, center.y);

//加入路徑
CGContextAddPath(context, path);

//裁切
CGContextClip(context);
[imageView drawRect:bounds];
[imageView setImage:UIGraphicsGetImageFromCurrentImageContext()];

CFRelease(path);
UIGraphicsEndImageContext();

上述程式碼透過設定範圍 Bounds 對影像進行切割剪裁,由於最後影像是由 UIGraphicsGetImageFromCurrentImageContext() 所取得,因此在 UIView 內的影像已經是真正切割完成的影像,而並非原圖因超出 Bounds 邊界而導致看不見。另一種類似此效果的做法可以參考CoreGraphic 遮色片應用一文。






沒有留言:

張貼留言