Изменение изображения UIBarButtonItem UIButton

У меня есть UIBarButtonItem с пользовательским представлением UIbutton с изображением, я хочу иметь другой UIImage для другой ориентации, поэтому вот мой код:

 UIButton * backButton = (UIButton *) ((UIBarButtonItem *) self.navBar_.topItem.leftBarButtonItem).customView;
        if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]) && IS_IPAD) {        
            [backButton setBackgroundImage:[UIImage imageNamed:@"back-landscape.png"] forState:UIControlStateNormal];  
            [backButton setFrame: CGRectMake(0, 0, 46, 35)]; 
        } else {
            [backButton setBackgroundImage:[UIImage imageNamed:@"back-reading.png"] forState:UIControlStateNormal];  
            [backButton setFrame: CGRectMake(0, 0, 23, 19)]; 
        }

Однако это не меняет образ UIButton, почему так?

4 ответа

Решение

Попробуй это:-

UIButton * backButton ;
if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]) && IS_IPAD) 
{ 
    backButton = [[UIButton alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 66.0f, 36.0f)];       
    [backButton setImage:[UIImage imageNamed:@"back-landscape.png"] forState:UIControlStateNormal];  

} 
else 
{
    backButton = [[UIButton alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 23, 19)];     
    [backButton setImage:[UIImage imageNamed:@"back-reading.png"] forState:UIControlStateNormal];  
    [backButton setFrame: CGRectMake(0, 0, 23, 19)]; 
}

[backButton addTarget:self action:@selector(goToHome) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *HomeButton = [[UIBarButtonItem alloc] initWithCustomView: backButton];
[self.navigationItem setLeftBarButtonItem:HomeButton];

Вы должны уведомить, что вы говорите, что это UIBarButtonItem , но вы используете UIButton в коде.

С ios5.0 вы можете использовать UIAppearence Protocol изменить UIBarButtonItem фоновое изображение, например:


[[UIBarButtonItem appearance] setBackgroundImage: forState: barMetrics:]

Вы также можете использовать метод elppa, но обратите внимание, что вы можете использовать напрямую UIImageView для customView параметр.

Вы можете использовать новый прокси-класс с методом +appereance для проверки DOC, но только для iOS5. Для более ранней поддержки вы можете обновить изображение при вращении представления, используя метод контроллера вида -willRotateToInterfaceOrientation. Чао

Создайте UIBarButton, используя пользовательскую UIButton:

_optionsButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_optionsButton setImage:[UIImage imageNamed:@"menu2.png"] forState:UIControlStateNormal];
[_optionsButton addTarget:self action:@selector(optionsButtonPressed) forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem * optionsItem = [[UIBarButtonItem alloc] initWithCustomView:_optionsButton];

Затем установите фоновое изображение, как обычно для этого UIButton (вместо того, чтобы пытаться изменить изображение для UIBarButton).

[_optionsButton setImage:[UIImage imageNamed:@"keyboard.png"] forState:UIControlStateNormal];

Это отлично сработало для меня

Примечание. Когда я проходил через это, я менял изображение в зависимости от текущего изображения. Я обнаружил, что должен был использовать:

if ([[_optionsButton imageForState:UIControlStateNormal] isEqual:[UIImage imageNamed: @"keyboard.png"]]) {
    // Code for the certain button function 
}

заставить его работать

Другие вопросы по тегам