解决UITableView在iOS7中UINavigationController里的顶部留白问题

时间:2022-11-17 23:27:18

解决UITableView在iOS7中UINavigationController里的顶部留白问题

解决UITableView在iOS7中UINavigationController里的顶部留白问题

出现问题时候的截图:

解决UITableView在iOS7中UINavigationController里的顶部留白问题

源码:

用到的类:

UIViewController+TitleTextAttributes.h 与 UIViewController+TitleTextAttributes.m

//
//  UIViewController+TitleTextAttributes.h
//  YouXianMing
//
//  Created by YouXianMing on 14-9-20.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "NCTitleAttribute.h"

@interface UIViewController (TitleTextAttributes)

/**
 *  设置当前控制器的标题属性
 *
 *  @param attribute 属性对象
 */
- (void)titleTextAttributes:(NCTitleAttribute *)attribute;

@end
//
//  UIViewController+TitleTextAttributes.m
//  YouXianMing
//
//  Created by YouXianMing on 14-9-20.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "UIViewController+TitleTextAttributes.h"

@implementation UIViewController (TitleTextAttributes)

#pragma mark - public
- (void)titleTextAttributes:(NCTitleAttribute *)attribute
{
    [self controller:self
 titleTextAttributes:[attribute transformToDictionary]];
}

#pragma mark - private
- (void)controller:(UIViewController *)controller titleTextAttributes:(NSDictionary *)dictionary
{
    if ([controller isKindOfClass:[UIViewController class]]) {
        [controller.navigationController.navigationBar setTitleTextAttributes:dictionary];
    }
}

@end

NCTitleAttribute.h 与 NCTitleAttribute.m

//
//  NCTitleAttribute.h
//  YouXianMing
//
//  Created by YouXianMing on 14-9-20.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NCTitleAttribute : NSObject

@property (nonatomic, strong) UIColor *titleColor;   // 标题颜色
@property (nonatomic, strong) UIFont  *titleFont;    // 标题字体

@property (nonatomic, strong) UIColor *shadowColor;  // 阴影颜色
@property (nonatomic, assign) CGSize   shadowOffset; // 阴影偏移量

// 将参数转换为字典
- (NSDictionary *)transformToDictionary;

@end
//
//  NCTitleAttribute.m
//  YouXianMing
//
//  Created by YouXianMing on 14-9-20.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "NCTitleAttribute.h"

@implementation NCTitleAttribute

- (NSDictionary *)transformToDictionary
{
    NSMutableDictionary *dic = [NSMutableDictionary new];
    
    if (_titleColor)
    {
        [dic setObject:_titleColor forKey:NSForegroundColorAttributeName];
    }
    else
    {
        [dic setObject:[UIColor blackColor] forKey:NSForegroundColorAttributeName];
    }
    
    if (_titleFont)
    {
        [dic setObject:_titleFont forKey:NSFontAttributeName];
    }
    
    if (_shadowOffset.height && _shadowOffset.width)
    {
        NSShadow *shadow = [NSShadow new];
        
        shadow.shadowColor  = _shadowColor;
        shadow.shadowOffset = _shadowOffset;
        
        [dic setObject:shadow forKey:NSShadowAttributeName];
    }
    
    return dic;
}

@end

控制器源码:

//
//  ViewController.m
//  UIRectEdgeNone
//
//  Created by YouXianMing on 14/10/29.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "ViewController.h"
#import "UIViewController+TitleTextAttributes.h"
#import "NCTitleAttribute.h"
#import "WxHxD.h"

@interface ViewController ()<UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong) UITableView *tableView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
 
    // 初始化标题
    [self initTitle];
    
    // 背景view
    UIView *backView = [[UIView alloc] initWithFrame:\
                            CGRectMake(0, [WxHxD statusBarAndNavigationBarHeight],
                                       [WxHxD screenWidth],
                                       [WxHxD screenHeight] - [WxHxD  statusBarAndNavigationBarHeight])];
    backView.layer.borderWidth = 2.f;
    backView.layer.borderColor = [UIColor redColor].CGColor;
    [self.view addSubview:backView];
    
    // tableView
    _tableView = [[UITableView alloc] initWithFrame:backView.bounds
                                              style:UITableViewStylePlain];
    _tableView.delegate   = self;
    _tableView.dataSource = self;
    [backView addSubview:_tableView];
    
}

- (void)initTitle {
    self.title                = @"YouXianMing";
    NCTitleAttribute *NCTitle = [NCTitleAttribute new];
    NCTitle.titleColor        = [UIColor redColor];
    NCTitle.titleFont         = [UIFont fontWithName:@"HelveticaNeue-Thin" size:24.f];
    [self titleTextAttributes:NCTitle];
}

#pragma mark - 代理
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 7;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *reusedFlag = @"YouXianMing";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reusedFlag];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                      reuseIdentifier:reusedFlag];
    }
    
    cell.textLabel.font      = [UIFont fontWithName:@"HelveticaNeue-Thin" size:18.f];
    cell.textLabel.text      = @"No Zuo No Die";
    cell.textLabel.textColor = [UIColor grayColor];
    
    return cell;
}

@end

如何解决呢?很简单:

添加以下代码:

    // 让边缘留白为空

    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];

    if (systemVersion >= 7.0) {

        self.edgesForExtendedLayout = UIRectEdgeNone;

    }

效果:

解决UITableView在iOS7中UINavigationController里的顶部留白问题

注意:此种问题只有在iOS7以上才会出现