it-swarm.com.ru

iOS 7: пользовательский задний индикатор положения изображения

У меня проблемы с правильной настройкой изображения заднего индикатора. Индикатор не по центру! 

Вот картинка:

Screenshot showing non-centered custom back indicator image

Я устанавливаю изображение индикатора в методе didFinishLaunchingWithOptions: ...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

   UIImage *image = [UIImage imageNamed:@"Back"];
   [UINavigationBar appearance].backIndicatorImage = image;
   [UINavigationBar appearance].backIndicatorTransitionMaskImage = image;

   return YES;
}

Как мне это отцентрировать? 

p.s Я уже читал это Пользовательское изображение заднего индикатора в iOS 7, не по центру , но на самом деле это не сработало для меня. 

16
Manfredi

Это происходит потому, что вы просто меняете источник изображения индикатора Back в вашем UINavigationView, а не на фрейм Смотрите, когда создается UINavigationView, кадр Back Indicator устанавливается так, чтобы он соответствовал размеру iOS по умолчанию. 7 назад изображение кнопки. Изображение кнопки «Назад» по умолчанию больше вашего, и поэтому оно выглядит не выровненным.

Чтобы это исправить, вам нужно сбросить рамку заднего индикатора, чтобы она соответствовала размеру вашего изображения. Другой вариант - создать UIButton с правильным размером кадра и изображением и назначить UIBarButtonItem. Затем вы можете заменить backBarButtonItem из вашего UINavigationItem новым UIBarButtonItem, который вы создали.

9
marcopaivaf
 UIEdgeInsets insets = UIEdgeInsetsMake(0, 0, 2, 0);
 UIImage *backArrowImage = [[UIImage imageNamed:@"Back"] imageWithAlignmentRectInsets:insets];

 [[UINavigationBar appearance] setBackIndicatorImage:backArrowImage];
 [[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:backArrowImage];
12
carmen_munich

Это решение работало для меня в Swift 2.1. iOS 9.2.1. (XCode 7.2) на iPhone в портретном режиме. Я тестировал его на симуляторах iPhone 5 и 6+, и он тоже работал.

import UIKit

class EVEMainNaviVC: UINavigationController
{
    override func viewWillAppear(animated: Bool)
    {
        super.viewWillAppear(animated)
    }

override func viewDidLoad()
{
    super.viewDidLoad()
    self.view.backgroundColor = APP_BACKGROUND_COLOR
    self.setupAppNaviagtionBar()
}


private func setupAppNaviagtionBar()
{
    dispatch_async(dispatch_get_main_queue())
    { () -> Void in
        self.navigationBar.setHeight(55.0)
        self.navigationBar.translucent        = false
        self.navigationBar.alpha              = 1.0
        self.navigationBar.barTintColor       = UIColor.whiteColor()
        let newBackButtonImageInset                         = UIEdgeInsetsMake(0, 0, -6, 0)
        let newBackButtonImage                              = UIImage(named: "back")?.imageWithAlignmentRectInsets(newBackButtonImageInset)
        self.navigationBar.backIndicatorImage               = newBackButtonImage
        self.navigationBar.backIndicatorTransitionMaskImage = newBackButtonImage
        self.navigationBar.tintColor = CUSTOM_BUTTON_COLOR
    }
}
}
1
MB_iOSDeveloper

Вот как я справился с проблемой, используя Appearance API, и отлично работает. При изменении backButtonBackgroundImage изображение автоматически растягивается по barButtonItem, поэтому мы должны изменить его размер до исходного, используя resizableImageWithCapInsets: . Чтобы расположить его внутри barButtonItem, мы затем используем imageWithAlignmentRectInsets , чтобы добавить заглавные буквы вокруг него. Затем просто назначьте его, используя setBackButtonBackgroundImage: forState: barMetrics .

Просто играйте с числами, и вы найдете правильную позицию.

int imageSize = 24;
UIImage *barBackBtnImg = [[[UIImage imageNamed:@"backButton"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, imageSize, 0, 0)] imageWithAlignmentRectInsets:UIEdgeInsetsMake(0, -10, 0, -10)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:barBackBtnImg forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
1
Borbea

Я нашел самое простое решение, которое я когда-либо видел. Всего три вещи. 

  1. Переопределите UINavigationBar и используйте его в своем UINavigationController

    let navigationController = UINavigationController(navigationBarClass: NavigationBar.self, toolbarClass: nil)
    navigationController.viewControllers = [viewController]
    
  2. Настройте ваши изображения индикатора:

    backIndicatorImage = #imageLiteral(resourceName: "back")
    backIndicatorTransitionMaskImage = #imageLiteral(resourceName: "back")
    
  3. Реализуйте layoutSubviews в свой пользовательский класс UINavigationBar.

    override func layoutSubviews() {
        super.layoutSubviews()
    
        subviews.forEach { (view) in
            if let imageView = view as? UIImageView {
                if imageView.image == backIndicatorImage || imageView.image == backIndicatorTransitionMaskImage {
                    view.frame.Origin.y = floor((frame.height - view.frame.height) / 2.0)
                }
            }
        }
    }
    

Это все. :)

0
Kamil Harasimowicz