UINavigationBar беды - PullRequest
       8

UINavigationBar беды

0 голосов
/ 18 июля 2011

У меня так много проблем с этим.

  1. Прежде всего, UINavigationBar встроен из UINavigationController подталкивает положение остальных моих контроллеров UIViewController вниз (которые я должен вручную подтолкнуть вверх).Я искал на stackoverflow и одно предложение говорит, чтобы скрыть текущую панель навигации и вручную добавить UINavigationBar в построителе интерфейса.Это подводит меня ко второй проблеме:
  2. Если я добавляю UINavigationBar вручную через IB, навигация становится «отключенной», например, кнопка «Назад» должна быть реализована вручную для всплывающих контроллеров представления.Это подводит меня к моей третьей проблеме:
  3. В спецификации, которая мне была дана, указано, что она хочет, чтобы кнопка «назад» имела форму кнопки «назад» (левая часть кнопки наклонена, как треугольник).К сожалению, я искал везде, и все говорят, что вам придется вручную добавить изображение, чтобы оно выглядело как кнопка возврата.Но что, если заголовок моей кнопки «Назад» длиннее, чем изображение?Я должен был бы сделать изображение для каждого заголовка!

Любые решения любых 3 из этих проблем были бы чрезвычайно полезны!

Ответы [ 3 ]

1 голос
/ 19 июля 2011

В XIB вам необходимо установить стиль панели навигации и стиль строки состояния UIView (в UiViewController.xib), чтобы увидеть фактический макет.

Если вы хотите отключить панель навигации, то So может настроить кадр представления UINavigationController, когда вы собираетесь добавить его в окно.Но здесь вам нужно позаботиться о нижней части каждого UIViewController в стеке UINavigationController.

1 голос
/ 19 июля 2011

Первая проблема: я использую родительское представление с 415 пикселями, потому что 45 (460-415) взяты панелью навигации.Не нужно подталкивать, так как я начинаю с 415.

Второй и третий: не совсем.Вы можете использовать растягиваемое изображение, где вы рисуете текст.Для этого рецепта вам понадобится кнопка с левой и правой стороной и один пиксель посередине, который будет растянут до размера (левая сторона + правая сторона + длина текста посередине).

Пример: левая кнопка с 12 + 1 + (размер текста) + 5 пикселей

left button

Затем сделайте это:

/**
 * Return the given image with white text written in the middle.
 *
 * The image should be stretchable.
 * The text is written with bold system font 12.
 *
 * @param btnLeft  The original image.
 * @param capWidth The capWidth to stretch it.
 * @param text     The text to draw in the image.
 * @return A image containing the original stretched image with some text written in the middle.
 */
+(UIImage*) drawText:(NSString*)text inImage:(UIImage*)image capWidth:(int)capWidth {

    if (image==nil) {
        return nil;
    } 

    // make it stretchable
    UIImage *stretchable = [image stretchableImageWithLeftCapWidth: capWidth
                                                      topCapHeight: 0];

    UIFont *font = [UIFont boldSystemFontOfSize:12];

    // the combined size is that of the image plus the text

    CGSize textSize = [text sizeWithFont:font];
    CGSize combinedSize = CGSizeMake(image.size.width + textSize.width, image.size.height); // should be +4 for more breath

    UIGraphicsBeginImageContext(combinedSize);

    // draw the image
    [stretchable drawInRect:CGRectMake(0,0,combinedSize.width,combinedSize.height)];

    // draw the text
    float y = (image.size.height-textSize.height)/2; // leaves even distance to top and bottom
    CGRect rect = CGRectMake(capWidth, y, textSize.width,textSize.height); // should be +2 for more breath space
    [[UIColor whiteColor] set];
    [text drawInRect:CGRectIntegral(rect) // positioning on a fractional point produces blurry text 
            withFont:font]; 

    // gets the result
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}

Обратите внимание, что я использую системный шрифт, если вы хотите что-то другое, добавьте еще один параметр.А затем вы добавляете следующее в viewLoad вашего контроллера:

// buttonLeft is the button UIImage
UIButton *back = [UIButton buttonWithType:UIButtonTypeCustom];  
UIImage *image = [ImageUtils drawText:@"Back" inImage:buttonLeft capWidth:14];    
[back setBackgroundImage:image forState:UIControlStateNormal];  
[back addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
back.frame = CGRectMake(0, 0, image.size.width, image.size.height);
UIBarButtonItem *backbi = [[[UIBarButtonItem alloc] initWithCustomView:back] autorelease];  
self.navigationItem.leftBarButtonItem = backbi;

Что мы достигаем с помощью этого кода?кнопки идеального размера, которые работают с любой локализованной строкой, и избавляют вас от создания 2x PNG (обычный + сетчатка) для каждого поддерживаемого языкаЭто похоже на код Core Graphics, который UIKit использует для рисования кнопок с заголовком, поэтому он не замедлит ваш пользовательский интерфейс.

0 голосов
/ 19 июля 2011

Это каскад проблем.Однако у меня есть простой ответ.

Есть изящное маленькое свойство UIViewController , которое называется wantsFullScreenLayout.Установите значение ДА для каждого контроллера представления, который вы хотите добавить в стек навигации, и они будут игнорировать тот факт, что имеется панель навигации.Просто не забудьте установить рамки ваших подпредставлений соответственно.

Это исправит вашу первую проблему.Решение остального должно прийти к вам естественным образом.

...