用户在UIPageViewController中执行部分滚动后,rightBarButtonItems将不适合

时间:2014-03-19 04:02:44

标签: ios uipageviewcontroller uinavigationitem rightbarbuttonitem

我基本上有一个使用DetailViewController中的PageViewController的Master-Detail样式应用程序。 PageViewController有三个不同的场景。根据当前场景,我在三者中分别设置了rightBarButtonItems。其中两个场景只有一个rightBarButtonItem,但其中一个场景使用两个。

如果用户从一个页面完全滚动到下一个页面,则没有问题。但是,如果用户仅在rightBarButton项目的方向上滚动并让屏幕弹回,则只会显示其中一个条形按钮项目。

根据Apple文档:

如果没有足够的空间显示数组中的所有项目,那么将不会显示与标题视图(如果存在)或栏左侧按钮重叠的项目。

这解释了发生了什么。当视图加载按钮时,它必须检查按钮可用的框架大小。控制器看到按钮将与标题重叠,因此消除了一个。我只需要在按钮出现或这种性质的东西时延迟。有没有人对如何克服这个问题有任何想法?

以下是我在DetailViewController

的viewDidLoad中声明按钮的方法
//Generate buttons 
    barButton = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
    [barButton setImage:[UIImage imageNamed:@"arrow-up.png"]];

    barButton2 = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
    [barButton2 setImage:[UIImage imageNamed:@"arrow-down.png"]];

然后将按钮传递到所需的viewController并显示在viewDidAppear

- (void) viewDidAppear:(BOOL)animated
{
    //downButton and upButton are set from barButton and barButton2 which were created in the `DetailViewController`

    [upButton setTarget:self];
    [downButton setTarget:self];
    [downButton setAction:@selector(action1)];
    [upButton setAction:@selector(action2)];

    navItem.rightBarButtonItems = @[downButton, upButton];
}

以下是一些可以看到之前和之后的图像

BeforePic

AfterPic

1 个答案:

答案 0 :(得分:0)

我偶然发现了这项工作。它并不完美,但它具有理想的效果。如果某人有更健全的解决方案,请自愿提出您的想法,我会接受您的回答。

我从这个问题的接受答案中得到了这个想法:Placing a custom view based UIBarButtonItem in the navigation bar without default horizontal padding

我只是添加了一个新的条形按钮项目,作为间隔符。

- (void) viewDidAppear:(BOOL)animated
{
    // Create a spacer to go to the right of our custom button,

    UIBarButtonItem *zeroSpacer = [[UIBarButtonItem alloc]
                                   initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                   target:nil action:nil];
    zeroSpacer.width = 0;

    [upButton setTarget:self];
    [downButton setTarget:self];
    [downButton setAction:@selector(action1)];
    [upButton setAction:@selector(action2)];

    navItem.rightBarButtonItems = @[zeroSpacer, downButton, upButton];

}

出于审美原因,我还在创建按钮方面做了一些工作,使它们更紧密地联系在一起。

以下是我在viewDidLoad的{​​{1}}中生成按钮的方法。 DetailViewController中的数字对我来说真的没有那么大意义,但我只是搞砸了,直到他们看起来正确。

UIEdgeInsetsMake

以下是部分滚动滑动之前和之后的结果。

BeforePic1

AfterPic1