Удаление эффекта блеска с кнопок на панели UINavigationBar - PullRequest
9 голосов
/ 05 сентября 2011

Как убрать эффект блеска / блеска с кнопок на панелях навигации?Если я настраиваю панель навигации с помощью пользовательского изображения, на кнопки это не влияет, могу ли я удалить эффект от них (линии и глянца) или определить шестнадцатеричный цветовой код для всей кнопки или даже пользовательское изображение для них тоже

Ответы [ 3 ]

18 голосов
/ 05 сентября 2011

Я только что прошел процесс выяснения этого. По сути, вам нужно создавать собственные растягиваемые изображения и использовать их в качестве фона кнопки, чтобы избавиться от блеска. Замена кнопок возврата в UINavigationController немного сложнее. Для этого я использовал UINavigationControllerDelegate, чтобы заменить кнопку возврата по умолчанию моей пользовательской кнопкой.

Вот код:

  1. Создайте категорию на UIBarButtonItem, которая создает вашу пользовательскую кнопку. Вот мой. Я использую эту категорию для настройки как обычных кнопок панели, так и кнопок возврата:

    @interface UIBarButtonItem (UIBarButtonItem_customBackground)
    
    + (id) customBarButtonWithTitle:(NSString *)title target:(id)target selector:(SEL)selector;
    + (id) customBackButtonWithTitle:(NSString *)title target:(id)target selector:(SEL)selector;
    
    @end
    
    @implementation UIBarButtonItem (UIBarButtonItem_customBackground)
    
    + (id) customButtonWithImageNamed:(NSString *)imageName selectedImageNamed:(NSString *)selectedImageName leftCapWidth:(CGFloat)leftCapWidth edgeInsets:(UIEdgeInsets)edgeInsets title:(NSString *)title target:(id)target selector:(SEL)selector {
        UIButton* customButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [customButton addTarget:target action:selector forControlEvents:UIControlEventTouchUpInside];
        customButton.titleLabel.font = [UIFont boldSystemFontOfSize:12.0f];
        customButton.titleLabel.shadowColor = [UIColor colorWithRed:0.0f/255.0f green:0.0f/255.0f blue:0.0f/255.0f alpha:0.25f];
        customButton.titleLabel.shadowOffset = CGSizeMake(0.0f, -1.0f);
        customButton.titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
        customButton.titleEdgeInsets = edgeInsets;
        UIImage* navButtonBackgroundImage = [[UIImage imageNamed:imageName] stretchableImageWithLeftCapWidth:leftCapWidth topCapHeight:0.0f];
        UIImage* navButtonPressedBackgroundImage = [[UIImage imageNamed:selectedImageName] stretchableImageWithLeftCapWidth:leftCapWidth topCapHeight:0.0f];
        [customButton setBackgroundImage:navButtonBackgroundImage forState:UIControlStateNormal];
        [customButton setTitle:title forState:UIControlStateNormal];
        [customButton setBackgroundImage:navButtonPressedBackgroundImage forState:UIControlStateHighlighted];
        [customButton setBackgroundImage:navButtonPressedBackgroundImage forState:UIControlStateSelected];
    
        CGSize size = CGSizeMake(30.0f, 30.0f);
        if (title != nil) {
            size = [[NSString stringWithString:title] sizeWithFont:customButton.titleLabel.font];
        }
        customButton.frame = CGRectMake(0.0f, 0.0f, size.width + 20.0f, 30.0f);
        customButton.layer.shouldRasterize = YES;
        customButton.layer.rasterizationScale = [[UIScreen mainScreen] scale];
        return [[[UIBarButtonItem alloc] initWithCustomView:customButton] autorelease];
    }
    
    + (id) customBarButtonWithTitle:(NSString *)title target:(id)target selector:(SEL)selector {
        return [self customButtonWithImageNamed:@"navButtonBG.png" 
                     selectedImageNamed:@"navButtonPressedBG.png" 
                           leftCapWidth:6.0f 
                             edgeInsets:UIEdgeInsetsMake(0.0f, 5.0f, 0.0f, 5.0f) 
                                  title:title 
                                 target:target 
                               selector:selector];
    }
    
    + (id) customBackButtonWithTitle:(NSString *)title target:(id)target selector:(SEL)selector {    
        return [self customButtonWithImageNamed:@"backButtonBG.png" 
                     selectedImageNamed:@"backButtonPressedBG.png" 
                           leftCapWidth:12.0f 
                             edgeInsets:UIEdgeInsetsMake(0.0f, 11.0f, 0.0f, 5.0f) 
                                  title:title 
                                 target:target 
                               selector:selector];
    }
    
    @end
    
  2. Добавьте кнопку на панель UINavigationBar

    UIBarButtonItem* logoutButton = [UIBarButtonItem customBarButtonWithTitle:@"Logout" target:self selector:@selector(logout)];
    self.navigationItem.rightBarButtonItem = logoutButton;
    
  3. Если вы также хотите заменить кнопки возврата UINavigationController, настройте UINavigationControllerDelegate и реализуйте метод willShowViewController следующим образом:

    - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
        if([navigationController.viewControllers count ] > 1) {
            UIViewController* backViewController = [navigationController.viewControllers objectAtIndex:(navigationController.viewControllers.count - 2)];
            NSString* backText = backViewController.title;
            UIBarButtonItem* newBackButton = [UIBarButtonItem customBackButtonWithTitle:backText target:navigationController selector:@selector(popViewControllerAnimated:)];
            viewController.navigationItem.leftBarButtonItem = newBackButton;
            viewController.navigationItem.hidesBackButton = YES;
        }
    }
    
  4. Вот растягиваемые изображения, которые я использую:

    • Кнопка возврата: back button Нажатие: enter image description here
    • Обычная кнопка: enter image description here Нажата: enter image description here
2 голосов
/ 29 января 2013

Для изменения кнопки «назад» нет необходимости реализовывать метод делегата uinavigationcontroller.

Вам нужно только установить для свойства hidesBAckButton значение YES после установки желаемой кнопки, как @Justin Gallacher объяснил прекрасно.

self.navigationItem.leftBarButtonItem = [UIBarButtonItem customBackButtonWithTitle:@"Back" target:self.navigationController   selector:@selector(popViewControllerAnimated:)];
self.navigationItem.hidesBackButton = YES;
0 голосов
/ 05 сентября 2011

Вы должны использовать пользовательскую кнопку с изображениями без какого-либо эффекта блеска на изображениях, с помощью которой вы можете избавиться от эффекта мрачного нажатия кнопки с панели навигации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...