1

我正在尝试使用自定义栏按钮图像。我按照Apple 的建议创建了一个带有白色对象和透明背景的简单 PNG 图像:

在此处输入图像描述

如您所见,没有应用抗锯齿(即我的确切图像,逐个像素)。

Apple 确实建议使用抗锯齿,但不提供更多细节。我原以为这将是软件的功能,就像它对文本一样,而不是预先将其应用于图像。

问题是——如何以编程方式为我的自定义条形按钮图像提供抗锯齿功能?

我已经尝试了几件事,但没有什么对我有用。这是我尝试过的一件事:

- (UIImage *)antialiasedImage
{
    // Check to see if Antialiased Image has already been initialized
    if (_antialiasedImage != nil) {
        return _antialiasedImage;
    }

    // Get Device Scale
    CGFloat scale = [[UIScreen mainScreen] scale];

    // Get the Image from Resource
    UIImage *buttonImage = [UIImage imageNamed:@"ReferenceFieldIcon"]; // .png???

    // Get the CGImage from UIImage
    CGImageRef imageRef = [buttonImage CGImage];

    // Find width and height
    NSUInteger width = CGImageGetWidth(imageRef);
    NSUInteger height = CGImageGetHeight(imageRef);



    // Begin Context
    UIGraphicsBeginImageContextWithOptions(buttonImage.size, YES, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();

    // Set Antialiasing Parameters
    CGContextSetAllowsAntialiasing(context, YES);
    CGContextSetShouldAntialias(context, YES);
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh);

    // Draw Image Ref on Context
    CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);

    // End Context
    UIGraphicsEndImageContext();



    // Set CGImage to UIImage
    _antialiasedImage =
    [UIImage imageWithCGImage:imageRef scale:scale orientation:UIImageOrientationUp];

    // Release Image Ref
    CGImageRelease(imageRef);



    return _antialiasedImage;
}

然后我像这样创建我的分段控件:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.


    NSArray *centerItemsArray =
    [NSArray arrayWithObjects:  @"S",
                                self.antialiasedImage,
                                @"D",
                                nil];


    UISegmentedControl *centerSegCtrl =
    [[UISegmentedControl alloc] initWithItems:centerItemsArray];

    centerSegCtrl.segmentedControlStyle = UISegmentedControlStyleBar;


    UIBarButtonItem *centerButtonItem =
    [[UIBarButtonItem alloc] initWithCustomView:(UIView *)centerSegCtrl];


    UIBarButtonItem *flexibleSpace =
    [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
                                                  target:nil
                                                  action:nil];




    NSArray *barArray = [NSArray arrayWithObjects:  flexibleSpace,
                                                    centerButtonItem,
                                                    flexibleSpace,
                                                    nil];

    [self setToolbarItems:barArray];
}

先感谢您!

4

1 回答 1

1

IOS 不会为渲染的图像添加抗锯齿——只有从代码中提取的项目。在保存到文件之前,您必须对图像进行抗锯齿处理。

从代码中消除锯齿图像的方法是绘制它们的代码。

于 2013-07-14T00:42:30.750 回答