UIBarButtonItem с пользовательским представлением не отображается после первого просмотра - PullRequest
7 голосов
/ 01 сентября 2011

ОК, это странно. Я целый час била головой об это, пытаясь отладить.

Я создал UIBarButtonItem с настраиваемым представлением, которое представляет собой UIButton с назначенным ему изображением. Код выглядит следующим образом

UIButton *btnAdd = [[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 28, 28)] autorelease];

[btnAdd setImage:[UIImage imageNamed:@"btn_add"] forState:UIControlStateNormal];

[btnAdd addTarget:self
           action:@selector(addBox)
 forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem *add = [[UIBarButtonItem alloc] initWithCustomView:btnAdd];

self.navigationItem.rightBarButtonItem = add;

Он находится в моем методе - (id)initWithNibName: на расширенном UIViewController

При первом появлении UIViewController кнопка появляется как обычно и работает нормально. ОДНАКО, если я нажму на другой контроллер представления, а затем нажму назад, кнопка невидима.

Даже когда она невидима, кнопка все еще работает. Я могу нажать на него, и он ведет себя нормально. Я точно знаю, что это оригинальный UIButton, так как я провел трассировку по его адресу памяти и другим свойствам ... это скрытое свойство FALSE, а его альфа-свойство установлено в 1.00f

Сначала я подумал, что это, возможно, проблема глубины, но у меня есть код, толкающий мой пользовательский фон UINavigationBar сзади на каждом цикле кадра, и ничего не меняется. СМ. ОБНОВЛЕНИЕ

Это похоже на то, как изображение высвобождается или что-то за кадром, но указатель на это тоже хорошо ...

Я предполагаю, что это какая-то странная причуда к рисованию, с которой мне просто нужно обойтись, но это очень сложная проблема для Google.

Любые советы будут оценены.

UPDATE

Оказывается, это проблема глубины. Я рисую пользовательский фон на drawRect:, и этот код ДОЛЖЕН сдвинуть пользовательский фон в конец стека представления, ОДНАКО, этот метод вызывается только один раз методами закрытого каркаса ... поэтому, когда панель перерисовывается после при первом просмотре фон не возвращается назад, и по какой-то глупой причине он решает перерисовать кнопки позади него.

Итак, сейчас я пытаюсь выяснить, как заставить фон отодвигаться назад каждый раз при рендеринге UINavigationBar.

Ответы [ 6 ]

2 голосов
/ 01 сентября 2011

попробуй Like it его работа Fine With Me

    UIImage *image = [UIImage imageNamed:@"btn_set-as-fea.png"];
    UIImage *hilghtedImage=[UIImage imageNamed:@"btn_set-as-fea_h.png"];
    CGRect frame = CGRectMake(0, 0, image.size.width, image.size.height);

    UIButton* someButton = [[UIButton alloc] initWithFrame:frame];
    [someButton addTarget:self action:@selector(SetAsFeatured) forControlEvents:UIControlEventTouchUpInside];
    [someButton setBackgroundImage:image forState:UIControlStateNormal];
    [someButton setBackgroundImage:hilghtedImage forState:UIControlStateHighlighted];
    [someButton setShowsTouchWhenHighlighted:YES];
   setAsFeatured = [[UIBarButtonItem alloc] initWithCustomView:someButton];
0 голосов
/ 22 сентября 2015

В моем случае я использую авторазметку во всем приложении и написал пользовательскую кнопку, где у меня есть следующая строка в конструкторе:

button.setTranslatesAutoresizingMaskIntoConstraints(false)

Когда я попытался использовать эту кнопку в качестве пользовательского представления для UIBarButtonItem, она не рисовалась.

Короче говоря, убедитесь, что для translatesAutoResizingMaskIntoConstraints установлено значение true.

0 голосов
/ 23 марта 2014

Звонок setNeedsDisplay вообще имеет какой-либо эффект?Особенно в том, что касается обновления, где вы создаете пользовательский фон с drawRect?

setNeedsDisplay обычно требуется, если вам нужно обновить отображение до любых измененных представлений, как правило, путем изменений до drawRect.

0 голосов
/ 23 марта 2014

Поскольку вы говорите, что UINavigationBar находится за фоном, вы можете использовать

[UIView bringSubviewToFront:barName];

, чтобы вывести его на передний план, или

[UIView sendSubviewToBack:background];

, чтобы отправить фон внижняя часть стека просмотра.

0 голосов
/ 23 марта 2014

Вы должны попробовать по этой ссылке . Позволяет отправлять пользовательское изображение назад, когда на навигационном контроллере есть какая-либо навигация.

0 голосов
/ 01 сентября 2011

Давным-давно я прошел с той же болью.И я реализовал следующее, постоянное решение, и оно прекрасно работает ...

btnAdd - это UIButton, и вы можете установить желаемое местоположение, задав его x и y.

    - (void)viewDidLoad 
    {
        btnAdd = [UIButton buttonWithType:UIButtonTypeCustom];
        btnAdd.frame = CGRectMake(250, 6, 61, 30);
        [btnAdd setImage:[UIImage imageNamed:@"btnAdd.png"] forState:UIControlStateNormal];
        btnAdd.backgroundColor = [UIColor clearColor];  
        [self.navigationController.navigationBar addSubview:btnAdd];
        [btnAdd addTarget:self action:@selector(btnAdd_clicked:) forControlEvents: UIControlEventTouchUpInside]; 
    }
    - (void)viewWillAppear:(BOOL)animated
    {   
        [btnAdd setHidden:FALSE];
    }
    - (void)viewWillDisappear:(BOOL)animated
    {
        [btnAdd setHidden:TRUE];    
    }
    - (void) btnAdd_clicked
    {
        // Your logic...
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...