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

Как правильно позиционировать кнопку "Назад" в iOS7

Я использовал этот код для использования пользовательского изображения в качестве кнопки "Назад" во всем приложении.

[[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@"back"]];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@"back"]];

Размеры изображения составляют 30 x 30.

Код добавляет изображение в качестве кнопки "Назад", но позиция неправильная, как вы можете видеть на следующем изображении:

back button not correct positioned

Любые идеи относительно правильного позиционирования изображения без изменения его размеров (по крайней мере, визуальная часть изображения (круг + стрелка))?

EDIT:

Я не хочу использовать пользовательскую кнопку "назад", потому что это заставляет меня отключить салфетки/обратный жест в iOS7

4b9b3361

Ответ 1

ИЗМЕНИТЬ
Я думаю, что я нашел трюк (в iOS 7 Design Resource - UIKit User Interface Catalog.)
В разделе Элементы панели бара

Обратите внимание, что изображение кнопки панели автоматически будет отображаться как изображение шаблона в панели навигации, если вы явно не установите режим рендеринга для UIImageRenderingModeAlwaysOriginal. Дополнительные сведения см. В разделе "Изображения шаблонов".

В Шаблоны у них есть код для указания UIImageRenderingMode.

UIImage *myImage = [UIImage imageNamed:@"back"];
UIImage *backButtonImage = [myImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];  
// now use the new backButtomImage
[[UINavigationBar appearance] setBackIndicatorImage:backButtonImage];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:backButtonImage];

Попробуйте создать UIImage с помощью вставки выравнивания, а затем установите обратный индикатор.

UIEdgeInsets insets = UIEdgeInsetsMake(10, 0, 0, 0); // or (0, 0, -10.0, 0)
UIImage *alignedImage = [[UIImage imageNamed:@"back"] imageWithAlignmentRectInsets:insets];  
[[UINavigationBar appearance] setBackIndicatorImage:alignedImage];
[[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:alignedImage];

Вы также можете попробовать отрегулировать положение текста заголовка UINavigationBar

[[UINavigationBar appearance] setTitleVerticalPositionAdjustment:(CGFloat)adjustment forBarMetrics:(UIBarMetrics)barMetrics];

дел >

Ответ 2

Хорошо просто следуйте одному из предложений по исправлению макета и потерям жест "назад" iOS 7, а затем исправьте его UIScreenEdgePanGestureRecognizer!

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

Ответ 3

ПОЖАЛУЙСТА, СМОТРЕТЬ РЕДАКТИЮ НИЖЕ!!!

Я создал пользовательскую кнопку возврата в iOS7 не так давно. У меня есть стрела и слово на ней. Я действительно думаю, что предложение pawan - хорошее начало. Чтобы создать кнопку "Назад" с вашим пользовательским изображением, вы можете использовать

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonClicked)];
[backButton setBackgroundImage:finalImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[backButton setTitlePositionAdjustment:UIOffsetMake(-20, 0) forBarMetrics:UIBarMetricsDefault];

self.navigationItem.leftBarButtonItem = backButton;

Мое изображение finalImage представляет собой композицию из двух разных изображений, но вы можете просто использовать свое "обратное" изображение. Но я думаю, что в этом проблема. Мое изображение было составным, вы могли бы также создать композит, но явное пространство над вашим задним значком. Я установил свободное место справа от моего значка, чтобы отрегулировать его расстояние. Вот код,

UIImage *arrow = [UIImage imageNamed:@"back.png"];
UIImage *wordSpace = [UIImage imageNamed:@"whiteSpace.png"];
CGSize size = CGSizeMake(arrow.size.width + wordSpace.size.width, arrow.size.height);
UIGraphicsBeginImageContext(size);
[arrow drawInRect:CGRectMake(0, 0, arrow.size.width, size.height)];
[wordSpace drawInRect:CGRectMake(arrow.size.width, 0, wordSpace.size.width, wordSpace.size.height)];
UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext(); 

Изображение wordSpace - это ясный png, который я сделал в Photoshop, поэтому мое новое изображение кнопки назад не растянулось. Возможно, вы захотите поместить прозрачный png сверху, чтобы немного подтолкнуть значок. Сделайте size.height этого в фотошопе для того, что, по вашему мнению, должно быть. Возможно, вам понадобится немного с этим. И не забудьте изменить CGSize так, чтобы он соответствовал вашему значку и четкому пространству.

Мое слово назад было немного выключено, поэтому я посмотрел на

[backButton setTitlePositionAdjustment:UIOffsetMake(-20, 0) forBarMetrics:UIBarMetricsDefault];

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

Теперь нужно иметь дело с тем, что вы хотите, чтобы это была настоящая кнопка возврата. Посмотрите на первую строку кода, которую я опубликовал. Действие на кнопке - @selector (backButtonClicked). Итак, все, что вам нужно сделать, это сделать этот метод, и вам должно быть хорошо идти!

- (void)backButtonClicked
{
  NSLog(@"going back");
  [self.navigationController popViewControllerAnimated:YES];
}

Надеюсь, это немного поможет.

enter image description here

ИЗМЕНИТЬ *****

Я немного поиграл с моим кодом и нашел лучший способ переместить задний значок. Я просто использовал колесо корабля, потому что у меня не было того же, что и вы, но он будет работать одинаково.

Так как вы действительно не хотите заголовок, вы можете создать кнопку с этим кодом,

UIImage *image = [UIImage imageNamed:@"781-ships-wheel.png"];

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:image style:UIBarButtonItemStylePlain target:self action:@selector(backButtonClicked)];

Просто измените 781 файл с вашим именем. Затем вы можете переместить его со следующим,

[backButton setImageInsets:UIEdgeInsetsMake(20, 0, -20, 0)];

Взгляните на это изображение.

pic one

Это значительно уменьшает значок, но я хотел показать вам эту идею. Числами для вложений Edge являются верхние, левые, нижние и правые. Не касайтесь левого и правого, если вам не нужно перемещать его таким образом, измените верх и низ. Обратите внимание, что если вам нужно переместить его на 20 пунктов, как я, (слишком много), вам нужно компенсировать отрицание для дна или значок будет сжат. Это то, что похоже на все ноль.

pic with zeros

Таким образом, вы можете в значительной степени перемещать его, когда захотите, но вам все равно придется настроить @selector (backButtonClicked), чтобы он работал как настоящая кнопка возврата.

Ответ 4

Это версия Swift 2. Самый простой способ - вот так. Поместите этот код в AppDelegate. '

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        let navigationBarAppearace = UINavigationBar.appearance()
        let image = UIImage(named: "back-btn")
        navigationBarAppearace.backIndicatorImage = image
        navigationBarAppearace.backIndicatorTransitionMaskImage = image

        return true
    }

Если ваша кнопка назад имеет цвет фона, она может работать неправильно.

Добавьте свой значок в asset folder для каждого разрешения, например: введите описание изображения здесь

Ответ 5

Проблема в том, что ваш образ слишком высок. Чтобы это доказать, сначала попробуйте этот код:

UIGraphicsBeginImageContextWithOptions(CGSizeMake(10,20), NO, 0);
CGContextFillRect(UIGraphicsGetCurrentContext(), CGRectMake(6,0,4,20));
UIImage* im = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.navbar.backIndicatorImage = im;
UIGraphicsBeginImageContextWithOptions(CGSizeMake(10,20), NO, 0);
UIImage* im2 = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.navbar.backIndicatorTransitionMaskImage = im2;

Это выглядит хорошо. Теперь измените 20 на 30 на два вызова CGSizeMake:

UIGraphicsBeginImageContextWithOptions(CGSizeMake(10,30), NO, 0);
CGContextFillRect(UIGraphicsGetCurrentContext(), CGRectMake(6,0,4,20));
UIImage* im = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.navbar.backIndicatorImage = im;
UIGraphicsBeginImageContextWithOptions(CGSizeMake(10,30), NO, 0);
UIImage* im2 = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.navbar.backIndicatorTransitionMaskImage = im2;

Значок теперь слишком высокий.

Так что просто сделайте изображение 20 пикселей высотой, и все будет хорошо.

Ответ 6

Вы можете попробовать это

self.navigationItem.leftBarButtonItem.imageInsets = UIEdgeInsetsMake(0, 0, 10, 0);

Ответ 7

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

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