Подтвердить что ты не робот

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, не вертикально центрированный, но на самом деле это не сработало для меня.

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Это решение работало для меня в 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
    }
}
}

Ответ 4

Вот как я столкнулся с проблемой с использованием API Appearance и отлично работает. При изменении изображения 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];

Ответ 5

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

  • Отмените UINavigationBar и используйте его в UINavigationController

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

    backIndicatorImage = #imageLiteral(resourceName: "back")
    backIndicatorTransitionMaskImage = #imageLiteral(resourceName: "back")
    
  • Внесите 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)
                }
            }
        }
    }
    

Вот и все.:)

Ответ 6

Моя цель состояла в том, чтобы расположить изображение кнопки "Назад", не вмешиваясь в подпредставления UINavigationItem. Итак, я создал расширение для UIImage которое добавляет отступ вокруг изображения.

extension UIImage {
    public func imageWith(padding: UIEdgeInsets) -> UIImage {
        let origin = CGPoint(x: padding.left, y: padding.top)
        let sizeWithPadding = CGSize(width: padding.left + size.width + padding.right, height: padding.top + size.height + padding.bottom)

        UIGraphicsBeginImageContextWithOptions(sizeWithPadding, false, 0.0)
        draw(in: CGRect(origin: origin, size: size))

        let imageWithPadding = UIGraphicsGetImageFromCurrentImageContext() ?? self
        UIGraphicsEndImageContext()

        return imageWithPadding
    }
}

Например: если вы хотите переместить изображение вверх, вы добавляете соответствующий отступ внизу. .imageWith(padding: UIEdgeInsets(top: 0, left: 0, bottom: 2, right: 0))