UITableView navigationController部分索引在导航标题后对齐

时间:2010-08-17 16:39:16

标签: uitableview uinavigationbar collation alignment indexed

在Section Indexed UITableView中,如何选择所选部分的标题(通过按部分索引)在屏幕的最顶部对齐 _not _ 下)导航控制器),但在顶部的导航栏标题后冲洗?

像这样:

<小时/> [按钮]屏幕顶部的导航栏标题[其他按钮]
X(部分信件)
部分内的项目....

要明确的是,我遇到的问题是,当右侧按下部分索引时,表格将部分滚动到屏幕的最顶部 隐藏在导航栏下方。我希望该部分标题正好导航标题触摸导航栏底部边界 后面的顶部字母行 - 例如,当表格首次出现时。

1 个答案:

答案 0 :(得分:1)

更好的解决方案:

a)睡一会儿。

b)意识到,在您睡觉时,'UIBarStyleBlackTranslucent'的使用已被 弃用 ,因此请执行以下操作:

  • 在Interface Builder中打开MainWindow.xib,在“Tab Bar Controller”中的“Navigation Controller”中选择“UINavigationBar”项,并将“Style”更改为'Black Opaque'而不是半透明的。
  • 在您的UITableViewController类文件中,写

    - (void)viewWillDisappear:(BOOL)animated {
    self.navigationController.navigationBar.translucent = YES; /* Yes, go underneath the Navigation Bar elsewhere if you want to. */
    [super viewWillDisappear:animated];
    }
    - (void)viewWillAppear:(BOOL)animated {
    self.navigationController.navigationBar.translucent = NO; /* No going underneath the Navigation Bar. Problem solved! */
    ...
        [super viewWillAppear:animated];
    }
    
c)停止感到尴尬,而是意识到睡眠现在是你的武器库中一种更有用的编码技术。 ,p

<小时/> 正确解决方案的线索:

  

“导航控制器永远不会在不透明导航栏下显示内容。”

     

“将导航控制器的半透明属性设置为YES。这样可以让您的内容覆盖导航栏。”

参见:developer.apple.com/iphone/library/featuredarticles/ViewControllerPGforiPhoneOS/NavigationControllers/NavigationControllers.html

参见:developer.apple.com/iphone/library/documentation/UIKit/Reference/UINavigationBar_Class/Reference/UINavigationBar.html#// apple_ref / occ / instp / UINavigationBar / translucent

  

UIBarStyle定义不同类型视图的风格外观......

     

UIBarStyleBlackTranslucent = 2,//已弃用

     

使用UIBarStyleBlack并将半透明属性设置为YES。

http://developer.apple.com/iphone/library/documentation/uikit/reference/UIKitDataTypesReference/Reference/reference.html

<小时/> 之前睡觉,修复“困难之路” ......

- (void)correctFrame:(UIView *)viewWithWrongFrame {
    CGRect correctedFrame = [[viewWithWrongFrame superview] frame];
    correctedFrame.size.height = correctedFrame.size.height - self.navigationController.navigationBar.frame.size.height; /* Height without Navigation Bar */
    correctedFrame.origin.y = correctedFrame.origin.y + self.navigationController.navigationBar.frame.size.height; /* Origin below Navigation Bar */
    [viewWithWrongFrame setFrame:correctedFrame];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    ...
    [self correctFrame:[self.navigationController.view.subviews objectAtIndex:0]]; /* Correct the frame so it is after the Navigation Bar */
    [self.tableView setContentInset:UIEdgeInsetsMake(-self.navigationController.navigationBar.frame.size.height, 0, 0, 0)]; /* Eliminate initial blank space at top.*/
    ...
}

- (void)cleanDisplay {
    [self.tableView setContentInset:UIEdgeInsetsZero]; /* Fix difference between horizontal and vertical orientation. */
    ...
}
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
    [self correctFrame:[self.navigationController.view.subviews objectAtIndex:0]]; /* Correct the frame so it is after the Navigation Bar */

    /* Clean the display after turning... */
    [self performSelectorOnMainThread:@selector(cleanDisplay) withObject:nil waitUntilDone:NO];
}
- (void)viewWillAppear:(BOOL)animated {
    ...
    [self performSelectorOnMainThread:@selector(cleanDisplay) withObject:nil waitUntilDone:NO];
    ...
}

请注意失败方法包括:

使用Interface Builder将UITableView嵌入到UIView中。没有工作因为它全部自动调整到全高。  调整[self.tableView superview] .frame = CGRectInset([self.tableView superview] .frame,44,44);  或.bounds无效,  self.tableView.frame也没有.bounds。

当我尝试时,出现了什么问题的线索:  self.navigationController.view.frame = CGRectInset(self.navigationController.view.frame,20,44);  这实际上改变了视图的大小与其中的表。显然,将子视图更改为可以解决原始问题。

用上面的方法修正了它。虽然在向后或向前移动到其他屏幕之前,需要将更改恢复到正常状态,以避免将元素转移到其他位置。