// // TPViewController.m // ThePaperDemo // // Created by Scar on 14-9-2. // Copyright (c) 2014年 scar1900. All rights reserved. // #import "TPViewController.h" #define deltaHeight 40 @interface TPViewController () { CGFloat oriLabelHeight; CGFloat edgeY; } @property (nonatomic, weak) UIView* scrollableView; @property (assign, nonatomic) float lastContentOffset; @property (strong, nonatomic) UIPanGestureRecognizer* panGesture; @property (assign, nonatomic) BOOL isCollapsed; @property (assign, nonatomic) BOOL isExpanded; @end @implementation TPViewController @synthesize naviBar; @synthesize barHeight; @synthesize lineView; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (CGFloat)barHeight { return self.naviBar.frame.size.height; } - (void)followScrollView:(UIView*)scrollableView { self.scrollableView = scrollableView; self.panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; [self.panGesture setMaximumNumberOfTouches:1]; [self.panGesture setDelegate:self]; [self.scrollableView addGestureRecognizer:self.panGesture]; self.panGesture.enabled = NO; CGRect frame = self.naviBar.frame; frame.origin = CGPointZero; self.overlay = [[UIView alloc] initWithFrame:frame]; if (!self.naviBar.backgroundColor) { TPLOG(@"[%s]: %@", __func__, @"Warning: no back color set"); } [self.overlay setBackgroundColor:self.naviBar.backgroundColor]; [self.overlay setUserInteractionEnabled:NO]; [self.naviBar addSubview:self.overlay]; [self.overlay setAlpha:0]; [self.naviBar bringSubviewToFront:self.lineView]; } - (void)disableFollowScroll { self.panGesture.enabled = NO; } - (void)enableFollowScroll { // self.panGesture.enabled = YES; } - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor colorWithHexString:BackGroundColor]; // Do any additional setup after loading the view. [self.navigationController.navigationBar setHidden:YES]; [self setNavigationbar]; lineView = [[UIView alloc]initWithFrame:CGRectZero]; lineView.backgroundColor = [UIColor colorWithHexString:LINECOLOR]; [self.naviBar addSubview:lineView]; [self.lineView makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.naviBar.left); make.right.equalTo(self.naviBar.right); make.bottom.equalTo(self.naviBar.bottom); make.height.equalTo(@0.5); }]; UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapNaviBar:)]; [self.naviBar addGestureRecognizer:tapGesture]; } - (void)setNavigationbar { CGRect screenRect = [[UIScreen mainScreen] bounds]; self.naviBar = [[UIView alloc]init]; self.naviBar.backgroundColor = [UIColor colorWithHexString:BackGroundColor]; if (isIOS7) { self.naviBar.frame = CGRectMake(0, 0, screenRect.size.width, 156/2); oriLabelHeight = 25; edgeY = 16; }else { self.naviBar.frame = CGRectMake(0, 0, screenRect.size.width, 120/2); oriLabelHeight = 25-16; edgeY = 0; } [self.view addSubview:self.naviBar]; } - (void)addBarChildView { } - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; } - (void)handlePan:(UIPanGestureRecognizer*)gesture { CGPoint translation = [gesture translationInView:[self.scrollableView superview]]; float delta = self.lastContentOffset - translation.y; self.lastContentOffset = translation.y; UILabel *label = (UILabel*)[self.view viewWithTag:kXHLabelBaseTag+self.currentIndex]; CGRect labelFrame; CGRect frame; if (delta > 0) { if (self.isCollapsed) { return; } frame = self.naviBar.frame; labelFrame = label.frame; if (frame.origin.y - delta < 0-deltaHeight) { delta = frame.origin.y + deltaHeight; } frame.origin.y = MAX(0-deltaHeight, frame.origin.y - delta); labelFrame.origin.y = MAX(oriLabelHeight-deltaHeight, labelFrame.origin.y - delta); self.naviBar.frame = frame; if (labelFrame.origin.y <= edgeY) { labelFrame.origin.y = edgeY; } label.frame = labelFrame; // labelFrame = label.frame; // if (frame.origin.y <= -10) { // // } // if (frame.origin.y == 0-deltaHeight) { self.isCollapsed = YES; self.isExpanded = NO; } [self updateSizingWithDelta:delta]; // Keeps the view's scroll position steady until the navbar is gone if ([self.scrollableView isKindOfClass:[UIScrollView class]]) { [(UIScrollView*)self.scrollableView setContentOffset:CGPointMake(((UIScrollView*)self.scrollableView).contentOffset.x, ((UIScrollView*)self.scrollableView).contentOffset.y - delta)]; } } if (delta < 0) { if (self.isExpanded) { return; } frame = self.naviBar.frame; labelFrame = label.frame; if (frame.origin.y - delta > 0) { delta = frame.origin.y - 0; } frame.origin.y = MIN(0, frame.origin.y - delta); labelFrame.origin.y = MIN(oriLabelHeight, labelFrame.origin.y - delta); self.naviBar.frame = frame; if (labelFrame.origin.y <= edgeY) { labelFrame.origin.y = edgeY; } label.frame = labelFrame; if (frame.origin.y == 0) { self.isExpanded = YES; self.isCollapsed = NO; } [self updateSizingWithDelta:delta]; } if ([gesture state] == UIGestureRecognizerStateEnded) { // Reset the nav bar if the scroll is partial self.lastContentOffset = 0; [self checkForPartialScroll]; } } - (void)checkForPartialScroll { CGFloat pos = self.naviBar.frame.origin.y; UILabel *label = (UILabel*)[self.view viewWithTag:kXHLabelBaseTag+self.currentIndex]; // Get back down if (pos >= -2) { [UIView animateWithDuration:0.2 animations:^{ CGRect frame; CGRect labelFrame; frame = self.naviBar.frame; labelFrame = label.frame; CGFloat delta = frame.origin.y - 0; frame.origin.y = MIN(0, frame.origin.y - delta); labelFrame.origin.y = MIN(oriLabelHeight, labelFrame.origin.y - delta); self.naviBar.frame = frame; if (labelFrame.origin.y <= edgeY) { labelFrame.origin.y = edgeY; } label.frame = labelFrame; self.isExpanded = YES; self.isCollapsed = NO; [self updateSizingWithDelta:delta]; // // This line needs tweaking // // [self.scrollView setContentOffset:CGPointMake(self.scrollView.contentOffset.x, self.scrollView.contentOffset.y - delta) animated:YES]; }]; } else { // And back up [UIView animateWithDuration:0.2 animations:^{ CGRect frame; CGRect labelFrame; frame = self.naviBar.frame; labelFrame = label.frame; CGFloat delta = frame.origin.y + deltaHeight; frame.origin.y = MAX(0-deltaHeight, frame.origin.y - delta); labelFrame.origin.y = MAX(oriLabelHeight-deltaHeight, labelFrame.origin.y - delta); self.naviBar.frame = frame; if (labelFrame.origin.y <= edgeY) { labelFrame.origin.y = edgeY; } label.frame = labelFrame; self.isExpanded = NO; self.isCollapsed = YES; [self updateSizingWithDelta:delta]; }]; } } - (void)updateSizingWithDelta:(CGFloat)delta { if (delta >= 0.5) { delta = 0.5; } CGRect frame = self.naviBar.frame; float alpha = 2*(frame.origin.y + deltaHeight) / frame.size.height; CGFloat textFontScale = TEXT_ONE_LEVELSIZE - TEXT_FOUR_LEVELSIZE; CGFloat textFont = textFontScale * alpha + TEXT_FOUR_LEVELSIZE; UILabel *label = (UILabel*)[self.view viewWithTag:kXHLabelBaseTag+self.currentIndex]; [self.overlay setAlpha:(1 - alpha)*2]; if (self.overlay.alpha >= 1) { self.overlay.userInteractionEnabled = YES; }else { self.overlay.userInteractionEnabled = NO; } /** * bug:5055(首页,在收缩顶部菜单时,点击右上角,依然有效,之后收起后有异常) */ label.font = appFont(textFont, NO); frame = self.scrollableView.frame; frame.origin.y = self.naviBar.frame.origin.y + self.naviBar.frame.size.height; // frame.size.height = frame.size.height + delta; self.scrollableView.frame = frame; // Changing the layer's frame avoids UIWebView's glitchiness frame = self.scrollableView.layer.frame; frame.size.height += delta; self.scrollableView.layer.frame = frame; } - (void)resetNaviBar { /** * bug:5027&&5217(瀑布流 :上推以后,导航栏澎湃文字会离时间很近) */ [UIView animateWithDuration:0.25 animations:^{ if (isIOS7) { self.naviBar.frame = CGRectMake(0, 0, rect_screen.size.width, 156/2); }else { self.naviBar.frame = CGRectMake(0, 0, rect_screen.size.width, 120/2); } [self updateSizingWithDelta:0.5]; UILabel *label = (UILabel*)[self.view viewWithTag:kXHLabelBaseTag+self.currentIndex]; CGRect rect = label.frame; rect.origin.y = 25; label.frame = rect; }completion:^(BOOL finished) { self.isCollapsed = NO; }]; } - (void)tapNaviBar:(id)sender { } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end