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