FSPagerView/FSPagerViewExample-Objc/FSPagerViewExample-Objc/BasicExampleViewController.m

266 lines
9.3 KiB
Objective-C

//
// BasicExampleViewController.m
// FSPagerViewExample-Objc
//
// Created by Wenchao Ding on 19/01/2017.
// Copyright © 2017 Wenchao Ding. All rights reserved.
//
#import "BasicExampleViewController.h"
#import "FSPagerViewExample_Objc-Swift.h"
#import "FSPagerViewObjcCompat.h"
@interface BasicExampleViewController () <UITableViewDataSource,UITableViewDelegate,FSPagerViewDataSource,FSPagerViewDelegate>
@property (strong, nonatomic) NSArray<NSString *> *sectionTitles;
@property (strong, nonatomic) NSArray<NSString *> *configurationTitles;
@property (strong, nonatomic) NSArray<NSString *> *pagingDistanceOptions;
@property (strong, nonatomic) NSArray<NSString *> *imageNames;
@property (assign, nonatomic) NSInteger numberOfItems;
@property (weak , nonatomic) IBOutlet UITableView *tableView;
@property (weak , nonatomic) IBOutlet FSPagerView *pagerView;
@property (weak , nonatomic) IBOutlet FSPageControl *pageControl;
- (IBAction)sliderValueChanged:(UISlider *)sender;
@end
@implementation BasicExampleViewController
#pragma mark - Life cycle
- (void)viewDidLoad
{
[super viewDidLoad];
self.sectionTitles = @[@"Configurations", @"Paging Distance", @"Item Size", @"Interitem Spacing", @"Number Of Items"];
self.configurationTitles = @[@"Automatic sliding", @"Infinite"];
self.pagingDistanceOptions = @[@"Automatic", @"1", @"2"];
self.imageNames = @[@"1.jpg", @"2.jpg", @"3.jpg", @"4.jpg", @"5.jpg", @"6.jpg", @"7.jpg"];
self.numberOfItems = 7;
[self.pagerView registerClass:[FSPagerViewCell class] forCellWithReuseIdentifier:@"cell"];
self.pagerView.itemSize = CGSizeZero;
self.pageControl.numberOfPages = self.imageNames.count;
self.pageControl.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;
self.pageControl.contentInsets = UIEdgeInsetsMake(0, 20, 0, 20);
}
#pragma mark - UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return self.sectionTitles.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
switch (section) {
case 0:
return self.configurationTitles.count;
case 1:
return self.pagingDistanceOptions.count;
case 2:
case 3:
case 4:
return 1;
default:
break;
}
return 0;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
switch (indexPath.section) {
case 0: {
// Configurations
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
cell.textLabel.text = self.configurationTitles[indexPath.row];
if (indexPath.row == 0) {
// Automatic Sliding
cell.accessoryType = self.pagerView.automaticSlidingInterval > 0 ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
} else if (indexPath.row == 1) {
// IsInfinite
cell.accessoryType = self.pagerView.isInfinite ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
}
return cell;
}
case 1: {
// Paging Distance
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
cell.textLabel.text = self.pagingDistanceOptions[indexPath.row];
switch (indexPath.row) {
case 0:
// Hardcode like '-1' is bad for readability, but there haven't been a better solution to export a swift constant to objective-c yet.
cell.accessoryType = self.pagerView.pagingDistance == FSPagerViewAutomaticPagingDistance ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
break;
case 1:
cell.accessoryType = self.pagerView.pagingDistance == 1 ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
break;
case 2:
cell.accessoryType = self.pagerView.pagingDistance == 2 ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
break;
default:
break;
}
return cell;
}
case 2: {
// Item Spacing
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"slider_cell"];
UISlider *slider = cell.contentView.subviews.firstObject;
slider.tag = 1;
slider.value = ({
CGFloat scale = self.pagerView.itemSize.width/self.pagerView.frame.size.width;
CGFloat value = (0.5-scale)*2;
value;
});
slider.continuous = YES;
return cell;
}
case 3: {
// Interitem Spacing
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"slider_cell"];
UISlider *slider = cell.contentView.subviews.firstObject;
slider.tag = 2;
slider.value = self.pagerView.interitemSpacing / 20.0;
slider.continuous = YES;
return cell;
}
case 4: {
// Number Of Items
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"slider_cell"];
UISlider *slider = cell.contentView.subviews.firstObject;
slider.tag = 3;
slider.value = self.numberOfItems / 7.0;
slider.minimumValue = 1.0 / 7;
slider.maximumValue = 1.0;
slider.continuous = NO;
return cell;
}
default:
break;
}
return [tableView dequeueReusableCellWithIdentifier:@"cell"];
}
#pragma mark - UITableViewDelegate
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
return indexPath.section == 0 || indexPath.section == 1;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
switch (indexPath.section) {
case 0: {
if (indexPath.row == 0) {
// Automatic Sliding
self.pagerView.automaticSlidingInterval = 3.0 - self.pagerView.automaticSlidingInterval;
} else if (indexPath.row == 1) {
// IsInfinite
self.pagerView.isInfinite = !self.pagerView.isInfinite;
}
[tableView reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationAutomatic];
break;
}
case 1: {
switch (indexPath.row) {
case 0:
self.pagerView.pagingDistance = FSPagerViewAutomaticPagingDistance;
break;
case 1:
self.pagerView.pagingDistance = 1;
break;
case 2:
self.pagerView.pagingDistance = 2;
break;
default:
break;
}
[tableView reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationAutomatic];
break;
}
default:
break;
}
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
return self.sectionTitles[section];
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return section == 0 ? 40 : 20;
}
#pragma mark - FSPagerViewDataSource
- (NSInteger)numberOfItemsInPagerView:(FSPagerView *)pagerView
{
return self.numberOfItems;
}
- (FSPagerViewCell *)pagerView:(FSPagerView *)pagerView cellForItemAtIndex:(NSInteger)index
{
FSPagerViewCell *cell = [pagerView dequeueReusableCellWithReuseIdentifier:@"cell" atIndex:index];
cell.imageView.image = [UIImage imageNamed:self.imageNames[index]];
cell.imageView.contentMode = UIViewContentModeScaleAspectFill;
cell.imageView.clipsToBounds = YES;
cell.textLabel.text = [NSString stringWithFormat:@"%@%@",@(index),@(index)];
return cell;
}
#pragma mark - FSPagerView Delegate
- (void)pagerView:(FSPagerView *)pagerView didSelectItemAtIndex:(NSInteger)index
{
[pagerView deselectItemAtIndex:index animated:YES];
[pagerView scrollToItemAtIndex:index animated:YES];
}
- (void)pagerViewWillEndDragging:(FSPagerView *)pagerView targetIndex:(NSInteger)targetIndex
{
self.pageControl.currentPage = targetIndex;
}
- (void)pagerViewDidEndScrollAnimation:(FSPagerView *)pagerView
{
self.pageControl.currentPage = pagerView.currentIndex;
}
#pragma mark - Target actions
- (void)sliderValueChanged:(UISlider *)sender
{
switch (sender.tag) {
case 1: {
CGFloat scale = 0.5 * (1 + sender.value); // [0.5 - 1.0]
self.pagerView.itemSize = CGSizeApplyAffineTransform(self.pagerView.frame.size, CGAffineTransformMakeScale(scale, scale));
break;
}
case 2: {
self.pagerView.interitemSpacing = sender.value * 20; // [0 - 20]
break;
}
case 3: {
self.numberOfItems = roundf(sender.value * 7);
self.pageControl.numberOfPages = self.numberOfItems;
[self.pagerView reloadData];
break;
}
default:
break;
}
}
@end