UINavigationBar很难过

时间:2011-07-18 18:43:52

标签: objective-c ios xcode uinavigationcontroller uinavigationbar

我遇到这么多问题。

  1. 首先,UINavigationController内置的UINavigationBar 轻推其余UIViewControllers的位置(我必须手动轻推该位置)。我搜索了stackoverflow,一个建议是隐藏当前导航栏并在界面构建器中手动添加UINavigationBar。这让我想到了第二个问题:
  2. 如果我通过IB手动添加UINavigationBar,导航将变为“断开连接”,例如,后退按钮需要手动实现以弹出视图控制器。这让我想到了第三个问题:
  3. 我给出的规格说明它需要具有后退按钮形状的后退按钮(按钮的左侧像三角形一样倾斜)。不幸的是,我一直在各地搜索,每个人都说你必须手动添加一个图像,使它看起来像一个后退按钮。但是,如果我的后退按钮标题比图像长?我必须为每个标题制作一个图像!
  4. 任何解决其中任何一个问题的方法都会非常有用!

3 个答案:

答案 0 :(得分:1)

在XIB中,您必须设置UIView的导航栏样式和状态栏样式(在UiViewController.xib中)以查看实际布局。

如果你想要关闭导航栏,那么当你要在窗口上添加它时,可以调整UINavigationController视图的框架。 b在这里你必须处理UINavigationController堆栈下每个UIViewController的下半部分。

答案 1 :(得分:1)

第一个问题:我使用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(普通+视网膜)。这类似于UIKit用于绘制带标题的按钮的核心图形代码,因此它不会减慢您的UI速度。

答案 2 :(得分:0)

这是一连串的问题。不过,我有一个简单的答案。

UIViewController有一个叫做wantsFullScreenLayout的漂亮的小属性。对于要添加到导航堆栈的每个视图控制器,将其设置为 YES ,他们将忽略导航栏的事实。只需记住相应地设置子视图的帧。

这可以纠正您的第一个问题。其余的解决方案应该是你自然而然的。