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

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

//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 Display)

enter image description here

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

enter image description here

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

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

enter image description here

EDIT:

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

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

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

enter image description here

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

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

Ответы [ 2 ]

2 голосов
/ 09 января 2012

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

MyImage.png должен быть в два раза меньше MyImage@2x.png.

1 голос
/ 09 января 2012

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

...