Ios 将分段控件添加到导航栏,并使用按钮保留标题

Ios 将分段控件添加到导航栏,并使用按钮保留标题,ios,uinavigationbar,uisegmentedcontrol,Ios,Uinavigationbar,Uisegmentedcontrol,我想在导航栏中添加分段控件,但同时保留标题和按钮,如iOS 7 Appstore购买部分() 我曾尝试将分段控件添加为标题视图,然后使用提示作为标题,但按钮与分段控件处于同一级别。我尝试使用另一种方法解决您的问题,因为仅使用导航栏似乎不起作用(可能是因为AppStore应用程序使用的是私有api,但我没有足够的知识来确定……) 无论如何,我只是简单地使用了一个工具栏,它位于导航栏的正下方,我在上面添加了一个分段控件,所有这些都在常规UIViewController中 这是故事板中的样子: 这是

我想在导航栏中添加分段控件,但同时保留标题和按钮,如iOS 7 Appstore购买部分()


我曾尝试将分段控件添加为标题视图,然后使用提示作为标题,但按钮与分段控件处于同一级别。

我尝试使用另一种方法解决您的问题,因为仅使用导航栏似乎不起作用(可能是因为AppStore应用程序使用的是私有api,但我没有足够的知识来确定……) 无论如何,我只是简单地使用了一个工具栏,它位于导航栏的正下方,我在上面添加了一个分段控件,所有这些都在常规UIViewController中

这是故事板中的样子:

这是模拟器中的结果:

只需小心向下偏移表视图,以考虑工具栏占用的垂直空间。
希望这有帮助!

我尝试在Xamarin.iOS中实现,从iOS 6开始,您可以继承UINavigationBar并在需要的地方添加控件和按钮。

我找到了两种解决方案:

1) 正如neural5torm所建议的,您可以将分段控件添加到具有相同导航栏背景颜色的UIView中

[self.navigationController.navigationBar addSubview:segmentedControl];
- (void)didAddSubview:(UIView *)subview
{
    [super didAddSubview:subview];

    if ([subview isKindOfClass:[UISegmentedControl class]])
    {
        CGRect frame = subview.frame;
        frame.origin.y += your extra height (probably 44.0f);
        subview.frame = frame;
    }
}
可以通过以下方式删除UINavigationBar的发际线:

for (UIView *view in self.navigationController.navigationBar.subviews)
{
    for (UIView *view2 in view.subviews)
    {
        if ([view2 isKindOfClass:[UIImageView class]])
        {
            [view2 removeFromSuperview];
        }
    }
}
这对于非半透明的导航栏是可以的



如果您想要半透明的导航栏:
2) 子类UINavigationBar通过覆盖
sizehatfits

- (CGSize)sizeThatFits:(CGSize)size
{
    size.width = self.frame.size.width;
    size.height = your height (probably 88.0f);
    return size;
}

要使用自定义导航栏,请执行以下操作:

UINavigationController *navController = [[UINavigationController alloc] initWithNavigationBarClass:[YouNavigationBar class] toolbarClass:nil];
[navController setViewControllers:@[viewController]];

标题和按钮项将位于底部。调整其垂直位置(在自定义导航栏的初始位置或通过外观代理)

查看UIBarButtonim类参考,也有
setTitlePositionAdjustment
和其他返回按钮的方法


创建分段控件时,将其添加到导航栏

[self.navigationController.navigationBar addSubview:segmentedControl];
- (void)didAddSubview:(UIView *)subview
{
    [super didAddSubview:subview];

    if ([subview isKindOfClass:[UISegmentedControl class]])
    {
        CGRect frame = subview.frame;
        frame.origin.y += your extra height (probably 44.0f);
        subview.frame = frame;
    }
}

分段控件将位于顶部。通过覆盖自定义导航栏中的
didAddSubview
来调整其垂直位置

[self.navigationController.navigationBar addSubview:segmentedControl];
- (void)didAddSubview:(UIView *)subview
{
    [super didAddSubview:subview];

    if ([subview isKindOfClass:[UISegmentedControl class]])
    {
        CGRect frame = subview.frame;
        frame.origin.y += your extra height (probably 44.0f);
        subview.frame = frame;
    }
}

尝试创建UINavigationBar子类,并使其符合UIToolbarDelegate协议。然后在-init方法中创建段控件,将其添加到UIToolBar上,并将其委托设置为自定义UINavigationBar类。然后写下这个魔术:

- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar {
    return UIBarPositionTopAttached;
}
-(UIBAR位置)位置FORBAR:(id)bar{
返回UIBarPositionTopAttached;
}
祝你好运

我的解决方案是:
将工具栏和分段控件添加到
xib
文件中。 根据需要对其进行自定义,并将其连接到视图控制器的插座:

然后,将其放入
viewDidLoad
方法中:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // add after your setup code
    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:self.segmentedControl];

    self.navigationItem.rightBarButtonItem = item;
}

我还没有完全实现它,但我计划做以下几点。(ios7)这将用于在同一导航栏上并排显示标题和按钮


在情节提要中,将空白视图添加到导航栏。然后向该视图添加标签和分段控件。这允许您将任何想要的控件添加到导航栏。到目前为止,用户界面工作正常,只是还没有连接好。我只是想分享我迄今为止的发现。

您可以在Apple示例代码中找到带有UISegmentedControl的导航栏:

以下是我对此代码的解释(以编程方式创建):

//文件MySegmController.h
@接口MySegmController:UIViewController
@结束
//文件MySegmController.m
#导入“MySegmController.h”
@接口MyNavBarView:UIView
@结束
@接口MySegmController()
{
ui分段控制*_segm;
UITableView*_表;
}
@结束
#定义SEGM_宽度250
@MySegmController的实现
-(void)负荷视图
{
[超级加载视图];
self.view.backgroundColor=[UIColor whiteColor];
self.title=@“title”;
float w=self.view.bounds.size.width;
NSArray*items=[[NSArray alloc]initWithObjects:@“一”,“二”,“三”,零];
_segm=[[UISegmentedControl alloc]initWithItems:items];
[项目发布];
[_segmsizetofit];
_segm.frame=CGRectMake((w-segm_-WIDTH)/2,0,segm_-WIDTH,_-segm.bounds.size.height);
_segm.autoresizingMask=uiviewautoresizingflexibleleleftmargin | UIViewAutoresizingFlexibleRightMargin;
_segm.selectedSegmentIndex=0;
MyNavBarView*topView=[[MyNavBarView alloc]initWithFrame:CGRectMake(0,0,w,_segm.bounds.size.height+10)];
topView.backgroundColor=[UIColor whiteColor];
topView.autoresizingMask=UIViewAutoresizingFlexibleWidth;
[topView添加子视图:_segm];
[_segm发布];
_table=[[UITableView alloc]initWithFrame:CGRectMake(0,topView.bounds.size.height,w,self.view.bounds.size.height-topView.bounds.size.height)样式:UITableViewStylePlain];
_table.autoresizingMask=UIViewAutoresizingFlexibleWidth | UIViewAutoResizingFlexibleHight;
_table.dataSource=self;
_table.delegate=自我;
[self.view addSubview:_table];
[_表发布];
//在_表之后添加topView,因为topView有阴影
[self.view addSubview:topView];
[topView发布];
}
-(无效)viewDidLoad
{
[超级视图下载];
self.navigationController.navigationBar.translucent=否;
//pixel_transp.png-具有透明背景的1x1图像
self.navigationController.navigationBar.shadowImage=[UIImage ImageName:@“像素传输”];
//pixel.png-带有白色背景的1x1图像
[self.navigationController.navigationBar setBackgroundImage:[UIImage ImageName:@“pixel”]forBarMetrics:UIBarMetricsDefault];
UIBarButtonItem*bt=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCancel目标:自我操作:@selector(onCancel)];
self.navigationItem.rightBarButtonItem=bt;
[英国电信发布];
}
-(无效)一旦取消
{
[self.presentingViewController dismissViewControllerAnimated:YES完成:NULL];
}
-(NSInteger)表视图:(UITableView*)表视图行数节:(NSInteger)节
{
返回2;