根據UIImageView class reference,蘋果表示不要繼承UIImageView。感謝@rob mayoff指出了這一點。
但是,如果您正在實現自己的drawRect,請從您自己的UIView子類開始。並且,它在drawRect中使用addClip
。您可以使用UIBezierPath做到這一點,而無需將其轉換爲CGPath。
- (void)drawRect:(CGRect)rect
{
// This assumes the clippingPath and image may be drawn in the current coordinate space.
[[self clippingPath] addClip];
[[self image] drawAtPoint:CGPointZero];
}
如果要向上或向下縮放以填充邊界,則需要縮放圖形上下文。 (你也可以申請一個CGAffineTransform
到clippingPath,但那是永久性的,所以你需要先複製clippingPath。)
- (void)drawRect:(CGRect)rect
{
// This assumes the clippingPath and image are in the same coordinate space, and scales both to fill the view bounds.
if ([self image])
{
CGSize imageSize = [[self image] size];
CGRect bounds = [self bounds];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextScaleCTM(context, bounds.size.width/imageSize.width, bounds.size.height/imageSize.height);
[[self clippingPath] addClip];
[[self image] drawAtPoint:CGPointZero];
}
}
這將單獨縮放圖像上的各軸。如果你想保持它的寬高比,你需要計算整體縮放比例,並且可能翻譯它,使它居中或者對齊。
最後,如果您的路徑被繪製了很多,所有這些相對較慢。您可能會發現將圖像存儲在CALayer中的速度更快,並且包含路徑的CAShapeLayer。 除測試外,請勿使用以下方法。您需要分別縮放圖像圖層和蒙版以使其排列整齊。優點是您可以更改蒙版而不渲染底層圖像。
- (void) setImage:(UIImage *)image;
{
// This method should also store the image for later retrieval.
// Putting an image directly into a CALayer will stretch the image to fill the layer.
[[self layer] setContents:(id) [image CGImage]];
}
- (void) setClippingPath:(UIBezierPath *)clippingPath;
{
// This method should also store the clippingPath for later retrieval.
if (![[self layer] mask])
[[self layer] setMask:[CAShapeLayer layer]];
[(CAShapeLayer*) [[self layer] mask] setPath:[clippingPath CGPath]];
}
如果您使用圖層蒙版進行圖像剪裁工作,則不再需要drawRect方法。刪除它的效率。
你如何檢測你想要剪輯的部分?通過手勢? – Shrawan