仿网易新闻导航栏(可封装)

新建一个ViewController,并签UIScrollViewDelegate协议

-(void)addSubView:(UIViewController *)currentController andSubview:(NSMutableArray *)controller;
-(void)addImageView:(UIImageView *)imageView;
- (void)addParentController:(UIViewController *)viewController;

.m如下

#import "SCNavigation.h"
#define UIColorWithRGBA(r,g,b,a)        [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:a]
@interface SCNavigation ()<UIScrollViewDelegate>

@property(nonatomic, strong)UIScrollView *content;
@property(nonatomic, strong)UIView *line;
@property(nonatomic, strong)UIScrollView *banner;
@property(assign, nonatomic)CGFloat oldSize;
@property(assign, nonatomic)CGFloat newSize;
@property(nonatomic, strong)UIView *background;
@property(retain, nonatomic)NSMutableArray *array;
@end

@implementation SCNavigation
- (id)initWithParentViewController:(UIViewController *)viewController
{
    self = [super init];
    if (self)
    {
        [self addParentController:viewController];
    }
    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
//    self.navigationController.navigationBarHidden = NO;

}
-(void)addView{
    self.banner = [[UIScrollView alloc]initWithFrame:CGRectMake(45, 13, 330, 40)];
    self.banner.contentSize = CGSizeMake(20+65*self.array.count, 0);
    //    banner.backgroundColor = [UIColor greenColor];
    self.banner.showsHorizontalScrollIndicator = NO;
    [self.background addSubview:self.banner];

    }
-(void)addSubView:(UIViewController *)currentController andSubview:(NSMutableArray *)controller{
    self.background = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 375, 64)];
    //    background.backgroundColor = [UIColor blueColor];
    self.background.layer.shadowColor = [UIColor lightGrayColor].CGColor;
    self.background.layer.shadowOffset = CGSizeMake(0, 4);//shadowOffset阴影偏移,x向右偏移4,y向下偏移4,默认(0, -3),这个跟shadowRadius配合使用
    self.background.layer.shadowOpacity = 0.8;//阴影透明度,默认0
    self.background.layer.shadowRadius = 3;//阴影半径,默认3
    self.background.layer.borderColor = [UIColor lightGrayColor].CGColor;
    currentController.navigationItem.titleView = self.background;
    self.array = [NSMutableArray arrayWithArray:controller];
    //    NSMutableArray *arra =[NSMutableArray arrayWithObjects:@"新闻", @"体育", @"时尚", @"最新", @"动态", @"国内", nil];
    NSMutableArray *array1 = [NSMutableArray array];
    [self addView];

    for (UIViewController *temp in controller) {
        NSString *title = temp.title;
        [array1 addObject:title];
    }
    for (int i = 0; i<array1.count; i++) {
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectMake(20+65*i, 0, 40, 40);
        //        button.backgroundColor = [UIColor redColor];
        [button setTitle:[array1 objectAtIndex:i] forState:UIControlStateNormal];
        button.tag = 10000+i;
        [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [button addTarget:self action:@selector(buttonAciton:) forControlEvents:UIControlEventTouchUpInside];
        [self.banner addSubview:button];
    }
    
    
    self.content = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, 375, 603)];
    self.content.contentSize = CGSizeMake(375*self.array.count, 0);
    self.content.backgroundColor =[UIColor yellowColor];
    self.content.pagingEnabled = YES;
    self.content.bounces = NO;
    self.content.delegate =self;
    self.content.showsHorizontalScrollIndicator = NO;
    for (int i = 0 ; i<self.array.count; i++) {
        UIViewController *first = [self.array objectAtIndex:i];
        first.view.frame = CGRectMake(0+375*i, 0, self.view.frame.size.width, self.view.frame.size.height);
        [self.content addSubview:first.view];
        [self addChildViewController:first];
        
    }
    self.automaticallyAdjustsScrollViewInsets = NO;
    //    banner.backgroundColor = [UIColor greenColor];
    [self.view addSubview:self.content];
    self.line = [[UIView alloc] initWithFrame:CGRectMake(20.0f,39, 40, 1.0)];
    self.line.backgroundColor = UIColorWithRGBA(20.0f, 80.0f, 200.0f, 0.7f);
    [self.banner addSubview:self.line];

    
}
- (void)addParentController:(UIViewController *)viewController
{
    // Close UIScrollView characteristic on IOS7 and later
    if ([viewController respondsToSelector:@selector(edgesForExtendedLayout)])
    {
        viewController.edgesForExtendedLayout = UIRectEdgeNone;
    }
    
    [viewController addChildViewController:self];
    [viewController.view addSubview:self.view];
    NSLog(@"nav= %@", self.navigationController);
}

-(void)buttonAciton:(UIButton *)button{
    NSInteger count = button.tag-10000;
    [self.content setContentOffset:CGPointMake(375*count, 0) animated:YES];
    [UIView animateWithDuration:0.2f animations:^{
        self.line.frame = CGRectMake(20+65*count, 39, 45 - 4.0f, 2);
    }];

}
-(void)addImageView:(NSString *)imageView{

    UIImageView *iamge = [[UIImageView alloc]initWithImage:[UIImage imageNamed:imageView]];
    iamge.frame = CGRectMake(5, 15, 40, 40);
    [self.background addSubview:iamge];

}
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    if (scrollView == self.content) {
        CGFloat size = scrollView.contentOffset.x/5.76923;
        [UIView animateWithDuration:0.2f animations:^{
            self.line.frame = CGRectMake(20+size, 39, 45 - 4.0f, 2);
        }];
    }
    
    
    
    
}
-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
    self.oldSize = scrollView.contentOffset.x;
    
}
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    self.newSize = scrollView.contentOffset.x;
    CGFloat size = (scrollView.contentOffset.x-375*(3)) /5.76;
    CGFloat size1 = (scrollView.contentOffset.x-375) /5.76;
    
    if (scrollView==self.content&&scrollView.contentOffset.x>375*(3)) {
        [self.banner setContentOffset:CGPointMake((20+size), 0) animated:YES];
    }
    
    if (self.newSize<self.oldSize&&scrollView.contentOffset.x<375*(2)&&scrollView.contentOffset.x>0) {
        [self.banner setContentOffset:CGPointMake((20+size1), 0) animated:YES];
        
    }
}

//用法如图
需注意ARC与MRC问题

原文地址:https://www.cnblogs.com/beiMuBK/p/4719190.html