Analysis of iOS development & quot; secret & quot; Page Effect of App content (2)
@ I wrote a "secret" Cell effect article a few days ago, but there is still a gap with the desired effect at work, and the scalability is poor, so I rewrite the encapsulation, put the overall view into the scrollView, which is basically the same effect as the secret app.
@ The Code is as follows: (the fuzzy effect class will not be written. You can search for "UIImage + ImageEffects" and import Accelerate. framework)
1. MTSecretAppEffect. h
# Import
@ Interface MTSecretAppEffect: NSObject/*** creates an overall scrollView, loads headScrollView and tableView on it, and slides up and down by it, all other slides are not allowed ** @ return mainScrollView */-(UIScrollView *) createMainScrollView;/*** create headScrollView ** @ return headScrollView */-(UIScrollView *) createHeadScrollView; /*** create a Fuzzy view of the header ** @ param scrollview headScrollView ** @ return blurImageView */-(UIImageView *) createBlurImageViewOfView :( UIScrollView *) scrollview; /*** in-(void) scrollViewDidScroll :( UIScrollView *) method called in scrollView ** @ param scrollView * @ param mainScrollView * @ param tableView * @ param headScrollView * @ param blurImageView */-(void) scrollDidScrollView :( UIScrollView *) scrollView withMainScrollView :( UIScrollView *) mainScrollView withTableView :( UITableView *) tableView withHeadScrollView :( UIScrollView *) headScrollView withBlurImageView :( UIImageView *) blurImageView @ end
2. MTSecretAppEffect. m
# Import "MTSecretAppEffect. h" # import "UIImage + ImageEffects. h" # import
# Define HEADER_HEIGHT 200366f # define export CGRectMake (0, 0,320, HEADER_HEIGHT) const CGFloat kBarHeight = 50366f; const CGFloat Limit = 0.5f; const CGFloat Limit = limit; @ implementation limit/missing: the caller sets the proxy-(UIScrollView *) createMainScrollView {// and Self. view is the same as the bottom ScrollView UIScrollView * mainScrollView = [[UIScrollView alloc] initWithFrame: [UIApplication sharedApplication]. keyWindow. frame]; mainScrollView. bounces = YES; mainScrollView. alwaysBounceVertical = YES; mainScrollView. contentSize = CGSizeZero; mainScrollView. showsVerticalScrollIndicator = YES; mainScrollView. returns mainScrollView;}-(UIScrollView *) createHeadScrollView {response * headScrollView = [[UIScrollView alloc] initWithFrame: callback]; headScrollView. scrollEnabled = NO; headScrollView. contentSize = CGSizeMake (320,100 0); return headScrollView;}-(UIImageView *) createBlurImageViewOfView :( UIScrollView *) scrollview {uigraphicsbeginimagecontextwitexceptions (scrollview. bounds. size, scrollview. opaque, 0.0); [scrollview. layer renderInContext: UIGraphicsGetCurrentContext ()]; UIImage * img = partial (); UIImageView * blurImageView = [[UIImageView alloc] initWithFrame: CGRectMake (0, 0,320, HEADER_HEIGHT)]; blurImageView. image = [img applyBlurWithRadius: 12 tintColor: [UIColor colorWithWhite: 0.8 alpha: 0.4] saturationDeltaFactor: 1.8 maskImage: nil]; blurImageView. autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; blurImageView. alpha = 0; blurImageView. backgroundColor = [UIColor clearColor]; return blurImageView;}-(void) preview :( UIScrollView *) scrollView preview :( optional *) mainScrollView withTableView :( UITableView *) tableView preview :( UIScrollView *) headScrollView withBlurImageView :( UIImageView *) blurImageView {CGFloat y = 0.0f; CGRect rect = HEADER_INIT_FRAME; if (scrollView. contentOffset. y <0.0f) {// pull down to increase the effect y = fabs (MIN (0.0f, mainScrollView. contentOffset. y); headScrollView. frame = CGRectMake (CGRectGetMinX (rect)-y/2.0f, CGRectGetMinY (rect)-y, CGRectGetWidth (rect) + y, CGRectGetHeight (rect) + y );} else {y = mainScrollView. contentOffset. y; blurImageView. alpha = MIN (1, y * kBlurFadeInFactor); CGFloat backgroundScrollViewLimit = headScrollView. frame. size. height-kBarHeight; if (y> backgroundScrollViewLimit) {headScrollView. frame = (CGRect ){. origin = {0, y-headScrollView. frame. size. height + kBarHeight },. size ={ 320, HEADER_HEIGHT }}; tableView. frame = (CGRect ){. origin = {0, CGRectGetMinY (headScrollView. frame) + CGRectGetHeight (headScrollView. frame )},. size = tableView. frame. size}; tableView. contentOffset = CGPointMake (0, y-Batch); CGFloat contentOffsetY =-rows * Rows; [headScrollView setContentOffset :( CGPoint) {0, rows} animated: NO];} else {headScrollView. frame = rect; tableView. frame = (CGRect ){. origin = {0, CGRectGetMinY (rect) + CGRectGetHeight (rect )},. size = tableView. frame. size}; [tableView setContentOffset :( CGPoint) {0, 0} animated: NO]; [headScrollView setContentOffset: CGPointMake (0,-y * kBackgroundParallexFactor) animated: NO ];}
3. main. m
# Import "RootViewController. h" # import "CommentCell. h" # import "MTSecretAppEffect. h" # define HEADER_HEIGHT 200366f @ interface RootViewController ()
@ Property (nonatomic, strong) MTSecretAppEffect * secretEffect; // secretApp effect object @ property (nonatomic, strong) UIScrollView * mainScrollView; // scrollView with the same size as view @ property (nonatomic, strong) UIScrollView * headScrollView; // @ property (nonatomic, strong) UIImageView * blurImageView; // @ property (nonatomic, strong) UITableView * tableView; // @ end @ implementation RootViewController-(void) viewDidLoad {[super ViewDidLoad]; // 0. create the SecretApp effect object self. secretEffect = [[MTSecretAppEffect alloc] init]; // 1. scrollView self. mainScrollView = [self. secretEffect createMainScrollView]; self. mainScrollView. delegate = self; self. view = self. mainScrollView; // 2. head background View self. headScrollView = [self. secretEffect createHeadScrollView]; // 3. background Image view UIImageView * imageView = [[UIImageView alloc] initWithFra Me: CGRectMake (0, 0,320, HEADER_HEIGHT)]; imageView. image = [UIImage imageNamed: @ "secret.png"]; imageView. autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self. headScrollView addSubview: imageView]; // 4. fuzzy View _ blurImageView = [self. secretEffect createBlurImageViewOfView: self. headScrollView]; [self. headScrollView addSubview: _ blurImageView]; // 5. tableView self. TableView = [[UITableView alloc] initWithFrame: CGRectMake (0, HEADER_HEIGHT, CGRectGetWidth (self. view. frame), CGRectGetHeight (self. view. frame)-50) style: UITableViewStylePlain]; self. tableView. scrollEnabled = NO; self. tableView. delegate = self; self. tableView. dataSource = self; self. tableView. tableFooterView = [[UIView alloc] initWithFrame: CGRectZero]; self. tableView. separatorColor = [UIColor cle ArColor]; // 6. add view [self. view addSubview: self. headScrollView]; [self. view addSubview: self. tableView]; // 7. set self. mainScrollView. contentSize = CGSizeMake (320, self. tableView. contentSize. height + CGRectGetHeight (self. headScrollView. frame);}-(void) scrollViewDidScroll :( UIScrollView *) scrollView {// 8. call method [self. secretEffect scrollDidScrollView: scrollView withMainScrollView: self. mainScrollView WithTableView: self. tableView withHeadScrollView: self. headScrollView withBlurImageView: self. blurImageView] ;}# pragma mark-hide the status bar-(BOOL) prefersStatusBarHidden {return YES ;}# pragma mark-UITableView dataSource-(NSInteger) numberOfSectionsInTableView :( UITableView *) tableView {return 1;}-(NSInteger) tableView :( UITableView *) tableView numberOfRowsInSection :( NSInteger) section {return 20;}-(CGFloat) TableView :( UITableView *) tableView heightForRowAtIndexPath :( NSIndexPath *) indexPath {return 40;}-(UITableViewCell *) tableView :( UITableView *) tableView cellForRowAtIndexPath :( NSIndexPath *) indexPath {CommentCell * cell = [tableView dequeueReusableCellWithIdentifier: [NSString stringWithFormat: @ "Cell % ld", indexPath. row]; if (! Cell) {cell = [[CommentCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: [NSString stringWithFormat: @ "Cell % ld", indexPath. row];} cell. textLabel. text = [NSString stringWithFormat: @ "section = % ld row = % ld", indexPath. section, indexPath. row]; return cell;}-(void) didReceiveMemoryWarning {[super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated .} @ end
@: