IOS中無(wú)限滾動(dòng)Scrollview效果
本文實(shí)例講了IOS無(wú)限滾動(dòng)效果,分享給大家供大家參考,具體內(nèi)容如下
滑動(dòng)到當(dāng)前位置時(shí)候才去請(qǐng)求,本地有內(nèi)容則直接顯示(以來(lái)SDWebImage,UIView+Ext)
HZScrollView.h
#import <UIKit/UIKit.h>
typedef void(^HZReturnBlock)(NSInteger index,CGFloat offset);
typedef NS_ENUM(NSUInteger, HZScrollViewPageControllPosition) {
HZScrollViewPageControllPositionNone,
HZScrollViewPageControllPositionLeft,
HZScrollViewPageControllPositionCenter,
HZScrollViewPageControllPositionRight,
};
@class HZScrollView;
@protocol HZScrollViewDelegate <NSObject>
@optional
- (void)resetPosition:(HZScrollView *)scrollView AndIndex:(NSInteger)index;
@end
@interface HZScrollView : UIView
/**
* 返回當(dāng)前位置
*/
@property (nonatomic, weak)id <HZScrollViewDelegate>delegate;
/**
* 默認(rèn)圖
*/
@property (nonatomic, strong) UIImage *hz_placeImage;
/**
* 圖片列表哇
*/
@property (nonatomic, strong) NSArray *hz_ImageList;
/**
* pagecongroll 位置
*/
@property (nonatomic, assign) HZScrollViewPageControllPosition hz_PageControllPosition;
/**
* 變換自身frame
*
* @param offset 偏移量
*/
- (void)transformView:(CGFloat)offset;
/**
* 獲取當(dāng)前位置以及便宜
*
* @param block 返回內(nèi)容
*/
- (void)hz_getContent:(HZReturnBlock)block;
@end
HZScrollView.m
#import "UIImageView+WebCache.h"
#import "HZScrollView.h"
#import "UIView+DylanFramTool.h"
#define HZ_FormatImage(val_imageView)\
- (UIImageView *)val_imageView\
{\
if (!_##val_imageView) {\
_##val_imageView = [[UIImageView alloc] init];\
}\
return _##val_imageView;\
}\
//寬度
#define HZ_SWidth self.bounds.size.width
//高度
#define HZ_SHeight self.bounds.size.height
#define HZ_PHeight 16
@interface HZScrollView ()<UIScrollViewDelegate>
@property (nonatomic, copy) HZReturnBlock hz_block;
/**
* 總數(shù)
*/
@property (nonatomic,assign) NSInteger hz_MaxCount;
/**
* 當(dāng)前位置
*/
@property (nonatomic,assign) NSInteger hz_currentIndex;
/**
* 容器
*/
@property (nonatomic, strong) UIScrollView *scrollView;
/**
* 你懂滴
*/
@property (nonatomic, strong) UIPageControl *pageControll;
/**視圖**/
@property (nonatomic, strong) UIImageView *leftImageView;
@property (nonatomic, strong) UIImageView *centerImageView;
@property (nonatomic, strong) UIImageView *rightImageView;
@end
@implementation HZScrollView
{
CGRect _hz_Frame;
}
#pragma mark -
#pragma mark - init
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
_hz_Frame = frame;
[self addSubview:self.scrollView];
[self configImageView];
[self addSubview:self.pageControll];
}
return self;
}
#pragma mark -
#pragma mark - config
- (void)configImageView
{
self.leftImageView.frame = CGRectMake(0, 0, HZ_SWidth, HZ_SHeight);
[self.scrollView addSubview:self.leftImageView];
self.centerImageView.frame = CGRectMake(HZ_SWidth, 0, HZ_SWidth, HZ_SHeight);
[self.scrollView addSubview:self.centerImageView];
self.rightImageView.frame = CGRectMake(HZ_SWidth * 2, 0, HZ_SWidth, HZ_SHeight);
[self.scrollView addSubview:self.rightImageView];
}
#pragma mark -
#pragma mark - reSet
- (void)setHz_placeImage:(UIImage *)hz_placeImage
{
_hz_placeImage = hz_placeImage;
[self changeImageLeft:-1 center:-1 right:-1];
if (self.hz_MaxCount) {
[self setHz_MaxCount:self.hz_ImageList.count];
}
}
- (void)setHz_ImageList:(NSArray *)hz_ImageList
{
_hz_ImageList = [hz_ImageList copy];
[self setHz_MaxCount:_hz_ImageList.count];
}
- (void)setHz_MaxCount:(NSInteger)hz_MaxCount
{
_hz_MaxCount = hz_MaxCount;
switch (_hz_MaxCount) {
case 0:
self.scrollView.scrollEnabled = NO;
[self changeImageLeft:-1 center:-1 right:-1];
break;
case 1:
self.scrollView.scrollEnabled = NO;
[self changeImageLeft:0 center:0 right:0];
break;
default:
self.scrollView.scrollEnabled = YES;
[self changeImageLeft:_hz_MaxCount - 1 center:0 right:1];
break;
}
self.pageControll.numberOfPages = _hz_MaxCount;
[self setHz_PageControllPosition:_hz_PageControllPosition];
}
- (void)setHz_PageControllPosition:(HZScrollViewPageControllPosition)hz_PageControllPosition
{
_hz_PageControllPosition = hz_PageControllPosition;
CGFloat width = self.hz_MaxCount * HZ_PHeight;
switch (_hz_PageControllPosition) {
case HZScrollViewPageControllPositionNone:
self.pageControll.hidden = YES;
break;
case HZScrollViewPageControllPositionLeft:
self.pageControll.hidden = NO;
self.pageControll.frame = CGRectMake(10, self.pageControll.frame.origin.y, width, self.pageControll.frame.size.height);
break;
case HZScrollViewPageControllPositionCenter:
self.pageControll.hidden = NO;
self.pageControll.frame = CGRectMake((self.bounds.size.width - width)/2.f, self.pageControll.frame.origin.y, width, self.pageControll.frame.size.height);
break;
case HZScrollViewPageControllPositionRight:
self.pageControll.hidden = NO;
self.pageControll.frame = CGRectMake(self.bounds.size.width - 10 - width, self.pageControll.frame.origin.y, width, self.pageControll.frame.size.height);
break;
default:
break;
}
if (width <= HZ_PHeight) {
self.pageControll.hidden = YES;
}
}
#pragma mark -
#pragma mark - LZ
- (UIScrollView *)scrollView
{
if (!_scrollView) {
_scrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
_scrollView.pagingEnabled = YES;
_scrollView.showsHorizontalScrollIndicator = NO;
_scrollView.delegate = self;
_scrollView.contentSize = CGSizeMake(HZ_SWidth * 3,0);
}
return _scrollView;
}
- (UIPageControl *)pageControll
{
if (!_pageControll) {
_pageControll = [[UIPageControl alloc] initWithFrame:CGRectMake(0,HZ_SHeight - HZ_PHeight,HZ_PHeight, 7)];
_pageControll.pageIndicatorTintColor = [UIColor lightGrayColor];
_pageControll.currentPageIndicatorTintColor = [UIColor whiteColor];
_pageControll.numberOfPages = self.hz_MaxCount;
_pageControll.currentPage = 0;
}
return _pageControll;
}
HZ_FormatImage(leftImageView);
HZ_FormatImage(centerImageView);
HZ_FormatImage(rightImageView);
#pragma mark -
#pragma mark - private Method
- (void)changeImageWithOffset:(CGFloat)offsetX
{
if (offsetX >= HZ_SWidth * 2) {
self.hz_currentIndex++;
if (self.hz_currentIndex == self.hz_MaxCount - 1) {
[self changeImageLeft:self.hz_currentIndex - 1 center:self.hz_currentIndex right:0];
}else if (self.hz_currentIndex == self.hz_MaxCount) {
self.hz_currentIndex = 0;
[self changeImageLeft:self.hz_MaxCount - 1 center:0 right:1];
}else {
[self changeImageLeft:self.hz_currentIndex-1 center:self.hz_currentIndex right:self.hz_currentIndex + 1];
}
if (self.hz_block) {
self.hz_block(self.hz_currentIndex,offsetX);
}
self.pageControll.currentPage = self.hz_currentIndex;
}
if (offsetX <= 0) {
self.hz_currentIndex--;
if (self.hz_currentIndex == 0) {
[self changeImageLeft:self.hz_MaxCount-1 center:0 right:1];
}else if (self.hz_currentIndex == -1) {
self.hz_currentIndex = self.hz_MaxCount-1;
[self changeImageLeft:self.hz_currentIndex-1 center:self.hz_currentIndex right:0];
}else {
[self changeImageLeft:self.hz_currentIndex-1 center:self.hz_currentIndex right:self.hz_currentIndex+1];
}
if (self.hz_block) {
self.hz_block(self.hz_currentIndex,offsetX);
}
self.pageControll.currentPage = self.hz_currentIndex;
}
[self setHz_PageControllPosition:_hz_PageControllPosition];
}
- (void)changeImageLeft:(NSInteger)leftIndex center:(NSInteger)centerIndex right:(NSInteger)rightIndex
{
if (self.hz_currentIndex > self.hz_MaxCount) {
return;
}
if (leftIndex == -1 && centerIndex == -1 && rightIndex == -1) {
self.leftImageView.image = self.hz_placeImage;
self.centerImageView.image = self.hz_placeImage;
self.rightImageView.image = self.hz_placeImage;
} else {
[self checkExistImage:self.hz_ImageList[leftIndex]
ImageView:self.leftImageView
CurrentIndex:@(leftIndex)];
[self checkExistImage:self.hz_ImageList[centerIndex]
ImageView:self.centerImageView
CurrentIndex:@(centerIndex)] ;
[self checkExistImage:self.hz_ImageList[rightIndex]
ImageView:self.rightImageView
CurrentIndex:@(rightIndex)];
}
[self.scrollView setContentOffset:CGPointMake(HZ_SWidth, 0)];
}
- (void)checkExistImage:(NSString *)urlString
ImageView:(UIImageView *)currentImageView
CurrentIndex:(NSNumber *)index
{
if ([[[SDWebImageManager sharedManager] imageCache] imageFromDiskCacheForKey:urlString])
{
currentImageView.image = [[[SDWebImageManager sharedManager] imageCache] imageFromMemoryCacheForKey:urlString];
return;
} else {
currentImageView.image = self.hz_placeImage;
if (self.hz_currentIndex != [index integerValue]) {
return;
}
[self performSelector:@selector(downLoadImage:) withObject:@[urlString,currentImageView] afterDelay:0 inModes:@[NSDefaultRunLoopMode]];
}
}
- (void)downLoadImage:(NSArray *)param
{
NSString *urlString = [param firstObject];
__weak UIImageView *currentImageView = [param lastObject];
[[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:urlString] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
NSLog(@"received:%@",@(receivedSize));
} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
currentImageView.image = image;
// [[[SDWebImageManager sharedManager] imageCache] storeImage:image forKey:urlString];
[[[SDWebImageManager sharedManager] imageCache] storeImage:image forKey:urlString toDisk:YES];
}];
}
#pragma mark -
#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
[self changeImageWithOffset:scrollView.contentOffset.x];
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
NSInteger index = scrollView.contentOffset.x/scrollView.width;
if ([self.delegate respondsToSelector:@selector(resetPosition:AndIndex:)]) {
[self.delegate resetPosition:self AndIndex:self.hz_currentIndex];
}
}
#pragma mark -
#pragma mark - public method
- (void)transformView:(CGFloat)offset
{
if (offset > 0) {
return;
}
CGFloat currentHeight = 210 - offset;
self.height = currentHeight ;
CGFloat currentScale = currentHeight / _hz_Frame.size.height;
self.left = _hz_Frame.origin.x - (_hz_Frame.size.width * currentScale - _hz_Frame.size.width)/2.f;
self.width = _hz_Frame.size.width * currentScale;
self.top = offset;
self.scrollView.size = self.size;
self.leftImageView.size = self.size;
self.centerImageView.size = self.size;
self.rightImageView.size = self.size;
self.centerImageView.x = self.width;
self.rightImageView.x = self.width * 2;
self.scrollView.contentSize = CGSizeMake(self.width *3, self.height);
[self.scrollView setContentOffset:CGPointMake(HZ_SWidth, 0)];
}
- (void)hz_getContent:(HZReturnBlock)block
{
self.hz_block = block;
}
- (void)layoutSubviews
{
[super layoutSubviews];
}
@end
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
- iOS實(shí)現(xiàn)滾動(dòng)字幕的動(dòng)畫(huà)特效
- iOS UIScrollView滾動(dòng)視圖/無(wú)限循環(huán)滾動(dòng)/自動(dòng)滾動(dòng)的實(shí)例代碼
- iOS使用UICollectionView實(shí)現(xiàn)橫向滾動(dòng)照片效果
- iOS利用UIScrollView實(shí)現(xiàn)無(wú)限滾動(dòng)效果
- iOS實(shí)現(xiàn)無(wú)限循環(huán)滾動(dòng)的TableView實(shí)戰(zhàn)教程
- iOS仿網(wǎng)易新聞滾動(dòng)導(dǎo)航條效果
- iOS實(shí)現(xiàn)類(lèi)似格瓦拉電影的轉(zhuǎn)場(chǎng)動(dòng)畫(huà)
- iOS實(shí)現(xiàn)卡片式滾動(dòng)效果 iOS實(shí)現(xiàn)電影選片效果
相關(guān)文章
IOS圖片無(wú)限輪播器的實(shí)現(xiàn)原理
這篇文章主要介紹了IOS圖片無(wú)限輪播器的實(shí)現(xiàn)原理的相關(guān)資料,需要的朋友可以參考下2016-03-03
iOS實(shí)現(xiàn)動(dòng)態(tài)的開(kāi)屏廣告示例代碼
啟動(dòng)圖是在iOS開(kāi)發(fā)過(guò)程中必不可少的一個(gè)部分,很多app在啟動(dòng)圖之后會(huì)有一張自定義的開(kāi)屏廣告圖,但是有的時(shí)候需要讓啟動(dòng)圖看起來(lái)就是一個(gè)廣告,而且還要這個(gè)廣告里面會(huì)動(dòng),iOS的啟動(dòng)圖只能是靜態(tài)的,而且固定,為了實(shí)現(xiàn)看起來(lái)的動(dòng)畫(huà)效果,只能進(jìn)行偽造了。下面來(lái)一起看看2016-09-09
iOS 鍵盤(pán)輸入限制(只能輸入字母,數(shù)字,禁止輸入特殊符號(hào))
本文主要介紹了iOS中鍵盤(pán)輸入限制(只能輸入字母,數(shù)字,禁止輸入特殊符號(hào))的方法。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04
使用SDLocalize實(shí)現(xiàn)高效完成iOS多語(yǔ)言工作
這篇文章主要介紹了使用SDLocalize實(shí)現(xiàn)高效完成iOS多語(yǔ)言工作的相關(guān)資料,需要的朋友可以參考下2022-10-10
iOS App的設(shè)計(jì)模式開(kāi)發(fā)中對(duì)State狀態(tài)模式的運(yùn)用
這篇文章主要介紹了iOS App的設(shè)計(jì)模式開(kāi)發(fā)中對(duì)State狀態(tài)模式的運(yùn)用,示例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-03-03
iOS 標(biāo)簽Tag列表的實(shí)現(xiàn)代碼
這篇文章主要介紹了本篇文章主要介紹了iOS 標(biāo)簽Tag列表的實(shí)現(xiàn)代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-04-04

