将UINavigationController的工具栏移到顶部,位于导航栏

时间:2015-07-18 15:55:51

标签: ios uinavigationcontroller uinavigationbar uitoolbar

创建UINavigationController时,您可以通过UIToolbar(或通过检查Interface Builder中的显示工具栏)显示其默认隐藏setToolbarHidden:animated:。这会导致工具栏出现在屏幕的底部,并且此工具栏在导航堆栈上的视图控制器的推送和弹出之间保持不变。这正是我需要的,除了我需要工具栏位于屏幕的顶部。它似乎正是Apple在iTunes应用程序中所做的事情:

enter image description here

如何将UINavigationController工具栏移到顶部,位于导航栏下方而不是底部?

在设置UIToolbarDelegate {{1}后,我尝试实施positionForBar:,覆盖UIBarPosition.TopAttached,然后返回UIBarPosition.Topdelegate转到self.navigationController?.toolbar,但这甚至没有调用委托方法,因此它没有改变条形位置。

请注意,我需要在导航之间保留工具栏,因此我无法将工具栏添加到视图控制器并将其放置在导航栏下。

2 个答案:

答案 0 :(得分:0)

此问题的解决方案是两个半步骤:

首先,你必须在工具栏中心添加一个观察者'构件。

其次,在 observeValueForKeyPath:ofObject:change:context:中,每次有人移动工具栏时将工具栏重新定位到目标位置(例如导航控制器本身,例如,当设备旋转时) )。

我是在UINavigationController子类中完成的。 为了避免递归,我已经安装了一个本地标志成员' inToolbarFrameChange'。

最后(一半)步骤有点难以找到...您已经访问了工具栏'框架'成员,让观察者完全被召唤......我想,其原因可能是,#'框架'作为UIToolbar中的一个方法和基础框架实现#39; UIView中的值仅在调用UIToolbar方法时更新?!?

我确实实现了这个'框架'在我的重载 setToolbarHidden:animated:方法中进行访问,该方法只会转发呼叫并访问工具栏框架'值。

@interface MMMasterNavigationController ()
@property (assign, nonatomic) BOOL          inToolbarFrameChange;
@end

@implementation MMMasterNavigationController

/*
 awakeFromNib

 */
- (void)awakeFromNib {

    [super awakeFromNib];

    // ... other inits

    self.inToolbarFrameChange = NO;
}

/*
 viewDidLoad

 */
- (void)viewDidLoad {

    [super viewDidLoad];

    // 'center' instead of 'frame' from: http://stackoverflow.com/a/17977278/2778898
    [self.toolbar addObserver:self
                   forKeyPath:@"center"
                      options:NSKeyValueObservingOptionNew 
                      context:0];
}

/*
 observeValueForKeyPath:ofObject:change:context:

 */
- (void)observeValueForKeyPath:(NSString *)pKeyPath
                      ofObject:(id)pObject
                        change:(NSDictionary<NSString *,id> *)pChange
                       context:(void *)pContext {

    if ([pKeyPath isEqualToString:@"center"]) {
        if (!self.inToolbarFrameChange) {
            //NSLog(@"%s (0): %@", __PRETTY_FUNCTION__, pChange);
            self.inToolbarFrameChange = YES;

            CGRect  tbFrame = self.toolbar.frame;
            // maybe some other values are needed here for you
            tbFrame = CGRectMake(0, 0, CGRectGetWidth(tbFrame), CGRectGetHeight(tbFrame));
            self.toolbar.frame = tbFrame;

            self.inToolbarFrameChange = NO;
        }
    } else {
        [super observeValueForKeyPath:pKeyPath ofObject:pObject change:pChange context:pContext];
    }
}

/*
 setToolbarHidden:animated:

 */
- (void)setToolbarHidden:(BOOL)pHidden
                animated:(BOOL)pAnimated {
    FLog;

    [super setToolbarHidden:pHidden animated:NO];

    // Access the 'frame' member to let to observer fire
    CGRect  rectTB = self.toolbar.frame;
    rectTB = CGRectZero;
}

答案 1 :(得分:0)

您可能不是创建UITableViewController而是创建UIViewController。鉴于UIViewController将UIToolBar放在NavigationBar和UITableView下面。将所有必需的UITableView列表委托给UIViewController,这就是全部。 为什么要使用UIViewController而不是UITableViewController?因为tableView不会有静态位置元素。你应该有一些不包含ScrollView的东西。在这种情况下,它只是UIView。你也可以使用tableView的UIScrollView进行一些破解,但我认为所描述的方法更容易。