|
//
// 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 () <UIGestureRecognizerDelegate> {
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
|