Пользовательская панель навигации iPhone с кнопкой не нажимает - PullRequest
0 голосов
/ 10 сентября 2010

У меня есть универсальное приложение для iPhone / iPad, и я хотел иметь настраиваемую панель навигации, в которой верхняя половина панели навигации содержала логотипы наших компаний, а нижняя - стандартную панель навигации.

Я понял, как это сделать, показав код ниже, но моя UIButton "logosButton" не всегда реагирует на нажатие, похоже, что активны только определенные части кнопки, а другие вообще ничего не делают ... Я не могу понять, почему это так.

- (void)viewDidLoad {
    [super viewDidLoad];
    [[self view] addSubview: navController.view];

    float width = IS_IPAD ? 768.0f : 320.0f;
    float logosHeight = IS_IPAD ? 20.0f : 20.0f;
    float barHeight = IS_IPAD ? 32.0f : 32.0f;

    self.navBar = [[UINavigationBar alloc] initWithFrame: CGRectMake(0.0f, logosHeight, width, barHeight)];

    UIView *tempView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, logosHeight)];
    UIButton *logosButton = [[UIButton alloc] init];
    [logosButton setBackgroundImage:[UIImage imageNamed:@"logo_bar_alone.png"] forState:UIControlStateNormal];
    [logosButton setBackgroundImage:[UIImage imageNamed:@"logo_bar_alone.png"] forState:UIControlStateHighlighted];

    [logosButton addTarget:self action:@selector(logosButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [logosButton setFrame: CGRectMake(0, 0, width, logosHeight)];
    [tempView addSubview: logosButton];
    [[self view] addSubview: tempView];
    [tempView release];

    [[self view] addSubview: self.navBar];

    self.navItem = [[UINavigationItem alloc] initWithTitle: @"Home"];
    [self.navBar pushNavigationItem:self.navItem animated:NO];
}

Метод: logosButtonClicked срабатывает время от времени, когда я нажимаю на кнопку UIB, но я четко нажимаю на определенные места, где вообще ничего не происходит ...

Очень расстраивает, я не думаю, что вижу образец в отношении того, где он активен, но кто-то может помочь, пожалуйста, здесь?

EDIT

Я думаю, что только что наткнулся на что-то, я изменил кнопку на UIButtonTypeRoundedRect и избавился от изображений (а также сделал его больше), и кажется, что я не могу нажать на нижнюю ИЛИ верхнюю части кнопки, где Кнопка округлена. Таким образом, средняя прямоугольная секция - единственная секция, где я могу щелкнуть ... с чего бы это?

РЕДАКТИРОВАТЬ 2 Для тех, кто рассматривает этот вопрос, пожалуйста, смотрите последние изменения Табера в его ответе. Навигационный контроллер по какой-то причине поглощает прикосновения, и мне нужно выяснить, почему это так, может быть ошибка?

1 Ответ

1 голос
/ 10 сентября 2010

ФИНАЛЬНЫЙ ОТВЕТ :)

Хорошо, после просмотра проекта это выглядит так, как будто UINavigationController, который расположен ниже кнопки, использует глобальные штрихи. Что определенно странно, потому что он был добавлен в качестве подпредставления НИЖЕ вашей кнопки. Таким образом, с UINavigationController должна происходить какая-то веселая работа с кадрами / прикосновениями. Я пытался установить navigationController.titleView.userInteractionEnabled = NO, но безрезультатно. Если кто-то знает, как в основном заставить UINavigationController и UINavigationBar не использовать штрихи (я говорю о фоне, где нет кнопок), пожалуйста, включите. UIButton touch работает отлично, когда UINavigationController не добавлен в представление.

Оригинальный ответ

Это могут быть некоторые другие элементы пользовательского интерфейса в [self view] или tempView, сидящие поверх кнопки и перехватывающие нажатия. Возможно, вы захотите попробовать закомментировать все остальное в представлениях и / или попытаться установить для них свойство userInteractionEnabled следующим образом:

[otherUIElement setUserInteractionEnabled: NO];

EDIT: Этот код делает так, что вы МОЖЕТЕ щелкнуть по круглым прямоугольным краям, но НЕ по тексту заголовка. Поэтому я подозреваю, что это своего рода подпредставление, не позволяющее кнопке поймать нажатие.


[logosButton addTarget:self action:@selector(logosButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
[logosButton setFrame: CGRectMake(0, 0, 320.0, 50.0)];
[logosButton setTitle: @"HELLO" forState: UIControlStateNormal];
[logosButton.titleLabel setUserInteractionEnabled: YES];

РЕДАКТИРОВАТЬ # 2:

Попробуйте использовать эту кнопку с подклассами и посмотрите, возникает ли проблема по-прежнему:


// NavBtn.h

@interface NavBtn : UIButton {

}

-(id)initWithTitle:(NSString *)text;

@end

// NavBtn.m

#import "NavBtn.h"

@implementation NavBtn

- (id)initWithTitle:(NSString *)text {
  if ((self = [super initWithFrame: CGRectMake(0, 0, 320, 50)])) {
    [self setTitle: text forState: UIControlStateNormal];
    self.backgroundColor = [UIColor clearColor];
    self.opaque = NO;
    [self setBackgroundImage:[UIImage imageNamed:@"logo_bar_alone.png"] forState: UIControlStateNormal];
    [self setBackgroundImage:[UIImage imageNamed:@"logo_bar_alone.png"] forState: UIControlStateHighlighted];
  }
  return self;
}

// i guess you shouldn't need to mess with layoutSubviews 

@end

Чтобы загрузить его в ваше представление:


#import "NavBtn.h"

... in viewDidLoad, etc ...
NavBtn *btn = [[NavBtn alloc] initWithTitle: @"hey"];
[self.view addSubview: btn];
[btn release];

Если ЭТО не работает, то должна быть какая-то сторонняя библиотека, которая делает какие-то броские переопределения категорий вашего класса UIButton или что-то в этом роде.

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