我尝试加快滚动UITableView的速度。我这样做是通过自己绘制单元格而不是添加子视图。
我想要绘制的一件事是图像。图像应具有圆形边缘。当我使用子视图绘制单元格时,我将UIImageView的图层更改为具有圆角。
现在我直接绘制UIImage并且没有要修改的图层。如何用圆边绘制图像?
答案 0 :(得分:0)
听起来你只想删除矩形图像中的角落:通过CGImage API创建一个新图像 - 您将对输入图像应用蒙版。
答案 1 :(得分:0)
我很确定我从stackoverflow获得了这段代码。
- (UIImage*)maskImage:(UIImage *)image withMask:(UIImage *)maskImage {
CGImageRef maskRef = maskImage.CGImage;
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
CGImageGetHeight(maskRef),
CGImageGetBitsPerComponent(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBytesPerRow(maskRef),
CGImageGetDataProvider(maskRef), NULL, false);
CGImageRef sourceImage = [image CGImage];
CGImageRef imageWithAlpha = sourceImage;
//add alpha channel for images that don't have one (ie GIF, JPEG, etc...)
//this however has a computational cost
// needed to comment out this check. Some images were reporting that they
// had an alpha channel when they didn't! So we always create the channel.
// It isn't expected that the wheelin application will be doing this a lot so
// the computational cost isn't onerous.
//if (CGImageGetAlphaInfo(sourceImage) == kCGImageAlphaNone) {
imageWithAlpha = CopyImageAndAddAlphaChannel(sourceImage);
//}
CGImageRef masked = CGImageCreateWithMask(imageWithAlpha, mask);
CGImageRelease(mask);
//release imageWithAlpha if it was created by CopyImageAndAddAlphaChannel
if (sourceImage != imageWithAlpha) {
CGImageRelease(imageWithAlpha);
}
UIImage* retImage = [UIImage imageWithCGImage:masked];
CGImageRelease(masked);
return retImage;
}
我称之为:
customImage = [customImage maskImage:customImage withMask:[UIImage imageNamed:@"CircularMask.png"]];
[customImageView setImage:customImage];
希望有所帮助!
答案 2 :(得分:0)
您是否对图像使用缓存?
如果是这样的话,我建议您在缓存之前将其应用于UIImage,这样一旦用圆角绘制它就可以重复使用该图像。
这是UIImage上的一个类别,您可以使用它来获得舍入的UIImage。
我可能在某个地方找到了这个代码,所以我提前向原作者道歉,因为没有给他/她一个信用。
#import <Foundation/Foundation.h>
@interface UIImage (DPRounded)
- (UIImage *)imageWithCornerRadius:(CGFloat)radius;
@end
@implementation UIImage (DPRounded)
static void addRoundedRectToPath(CGContextRef context, CGRect rect, float ovalWidth, float ovalHeight)
{
float fw, fh;
if (ovalWidth == 0 || ovalHeight == 0) {
CGContextAddRect(context, rect);
return;
}
CGContextSaveGState(context);
CGContextTranslateCTM (context, CGRectGetMinX(rect), CGRectGetMinY(rect));
CGContextScaleCTM (context, ovalWidth, ovalHeight);
fw = CGRectGetWidth (rect) / ovalWidth;
fh = CGRectGetHeight (rect) / ovalHeight;
CGContextMoveToPoint(context, fw, fh/2);
CGContextAddArcToPoint(context, fw, fh, fw/2, fh, 1);
CGContextAddArcToPoint(context, 0, fh, 0, fh/2, 1);
CGContextAddArcToPoint(context, 0, 0, fw/2, 0, 1);
CGContextAddArcToPoint(context, fw, 0, fw, fh/2, 1);
CGContextClosePath(context);
CGContextRestoreGState(context);
}
- (UIImage *)imageWithCornerRadius:(CGFloat)radius
{
UIImage * newImage = nil;
if(self != nil)
{
int w = self.size.width;
int h = self.size.height;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);
CGContextBeginPath(context);
CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
addRoundedRectToPath(context, rect, radius, radius);
CGContextClosePath(context);
CGContextClip(context);
CGContextDrawImage(context, CGRectMake(0, 0, w, h), self.CGImage);
CGImageRef imageMasked = CGBitmapContextCreateImage(context);
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
newImage = [[UIImage imageWithCGImage:imageMasked] retain];
CGImageRelease(imageMasked);
}
return [newImage autorelease];
}
@end
答案 3 :(得分:-1)
(在您开始之前,请检查您是否正确地将表视图单元格出列。这将对提高性能有很大帮助。)
使用圆角自己绘制图像,并让单元格的背景透明,比如说。
如果你的细胞高度可变,
使用resizableImageWithCapInsets:
(iOS5.0及更高版本)或已弃用的stretchableImageWithLeftCapWidth:topCapHeight:
用于早期的iOS,通过重复图像的中心块来返回将展开的图像。当进行自动调整时,这也将保护角落的曲率。或者,
将您的图像剪切成碎片,并为每个部分分别设置UIImageView
个实例,并为每个部分设置适当的自动调整。就性能而言,这是最佳选择,但最终可能会有多达九个出口。