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