Искаженные пользовательские кнопки навигации на дисплее без сетчатки (с использованием метода растягиваемого изображения)

Я добавляю пользовательские кнопки навигации в свои панели навигации с помощью следующего кода.

//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 (IOS5 с дисплеем Retina)

введите здесь описание изображения

Однако на моем симуляторе (или на дисплее без сетчатки) кнопки выглядят искаженными.

введите здесь описание изображения

Как я могу решить эту проблему? Как я могу правильно отображать кнопки даже для дисплеев без сетчатки?

Обратите внимание, что для этого я также создал кнопки @2x.

введите здесь описание изображения

РЕДАКТИРОВАТЬ:

Вроде как проблема с растягиванием изображения

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

Если я изменю значение leftCapWidth на 0, кнопки на симуляторе будут выглядеть лучше (но все равно плохо).

введите здесь описание изображения

Но при этом моя кнопка дисплея сетчатки будет выглядеть немного искаженной (похоже, я не могу победить).

Может ли кто-нибудь посоветовать, действительно ли проблема здесь, и как я могу изменить значения, чтобы они хорошо работали как для дисплеев с сетчаткой, так и для дисплеев без сетчатки?


person Zhen    schedule 09.01.2012    source источник


Ответы (2)


У вас есть два файла? MyImage.png и [email protected]? Похоже, что система пытается изменить размер файла @2x, уменьшая его, что обычно приводит к некоторой неровности, подобной этой, когда он просто уменьшается.

MyImage.png должен быть вдвое меньше [email protected].

person Chris Wagner    schedule 09.01.2012
comment
Я использую базовое изображение и растягиваю его с помощью UIImage *stretchableButtonImageNormal = [buttonImageNormal stretchableImageWithLeftCapWidth:12 topCapHeight:0]; Эта часть растяжения, похоже, была причиной проблемы, но я не уверен, как ее решить. - person Zhen; 10.01.2012
comment
да, похоже, что количество пикселей, которые я выбираю с шириной левой крышки, вызывает проблему - person Zhen; 12.01.2012

Вы не устанавливаете формат файла .png или что-то еще. И, как сказал Крис, вам нужны два файла: обычный и @2x.

person Hubert Kunnemeyer    schedule 09.01.2012