非视网膜显示器上的自定义导航按钮扭曲(使用可伸缩图像方法)

时间:2012-01-09 18:18:23

标签: objective-c ios button uinavigationbar retina-display

我通过以下代码将自定义导航按钮添加到导航栏。

//Instance method in CustomNavButton Class

-(UIButton*)setupButtonWithImage:(UIImage*)image andFrame:(CGRect)frame
{
    UIButton *button = [[[UIButton alloc]initWithFrame:frame]autorelease];
    UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake((frame.size.width-20)/2, (frame.size.height-20)/2, 20, 20)];
    imageView.image = image;

    UIImage *buttonImageNormal = [UIImage imageNamed:@"customBtn_black"];
    UIImage *stretchableButtonImageNormal = [buttonImageNormal
                                         stretchableImageWithLeftCapWidth:12 topCapHeight:0];

    button.titleLabel.font = [UIFont boldSystemFontOfSize:12];
    [button setBackgroundImage:stretchableButtonImageNormal
                  forState:UIControlStateNormal];

    [button setTitleShadowColor:[UIColor whiteColor] forState:UIControlStateNormal];

    [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

    [button addSubview:imageView];

    return button;

}

//Call CustomNavButton and add to Navbar
- (void)viewDidLoad
{
    [super viewDidLoad];
    //Add left invite friends button 
    CustomNavButton *leftButton = [[CustomNavButton alloc]initWithImage:[UIImage imageNamed:@"friends_1"] andFrame:CGRectMake(0, 0, 40, 32)];
    [leftButton.customNavButton addTarget:self action:@selector(inviteButtonPressed) forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem *leftBarButton = [[UIBarButtonItem alloc]initWithCustomView:leftButton];

    self.navigationItem.leftBarButtonItem = leftBarButton;
    [leftButton release];

}

我的iPhone(带Retina显示屏的IOS5)上的导航按钮显示正常

enter image description here

然而,按钮看起来在我的模拟器(或非视网膜显示器)上变形

enter image description here

我该如何解决这个问题?即使对于非视网膜显示器,如何正确显示按钮?

请注意,我也为此创建了@ 2x按钮

enter image description here

编辑:

似乎问题与图像的拉伸相似

UIImage *stretchableButtonImageNormal = [buttonImageNormal
                                     stretchableImageWithLeftCapWidth:12 topCapHeight:0];

如果我将leftCapWidth值更改为0,模拟器上的按钮看起来会更好(但仍然很糟糕)。

enter image description here

但通过这样做,它会使我的视网膜显示按钮看起来有点扭曲(似乎我不能赢)。

任何人都可以建议问题是否真的存在于此,以及我如何改变这些值以使其适用于视网膜和非视网膜显示器?

2 个答案:

答案 0 :(得分:2)

你有两个文件吗? MyImage.png和MyImage@2x.png?看起来系统正试图通过缩小它来调整@ 2x文件的大小,这通常会导致一些像这样的锯齿状的缩小。

MyImage.png应该是MyImage@2x.png的一半大小。

答案 1 :(得分:1)

您没有设置文件格式.png或其他任何内容。正如克里斯所说,你需要常规的两个文件和@ 2x。