iOS實現(xiàn)帶有縮放效果的自動輪播圖
本文實例為大家分享了iOS帶有縮放效果的自動輪播圖,供大家參考,具體內(nèi)容如下
可直接設(shè)置frame然后加載到視圖上使用。
效果就是這樣的,圖片切換的過程中還是有卡頓,不夠流暢,后續(xù)更新。

直接上代碼。
.h文件包含:
#import <UIKit/UIKit.h> @interface CustomScrollView : UIView @property (strong,nonatomic) NSArray *imageArr; @end
.m文件包含:
#import "CustomScrollView.h"
@interface CustomScrollView ()<UIScrollViewDelegate>
@property (strong,nonatomic) UIScrollView *scrollView;
@property (strong,nonatomic) UIImageView *backImageView;
@property (strong,nonatomic) UIImageView *leftIamgeView;
@property (strong,nonatomic) UIImageView *middleImageView;
@property (strong,nonatomic) UIImageView *rightImageView;
@property (strong,nonatomic) UIPageControl *pageControl;
//高度
@property (assign,nonatomic) CGFloat scrollViewHeight;
//手動造成的偏移量
@property (assign,nonatomic) CGFloat offsetX;
@property (strong,nonatomic) NSTimer *timer;
//屬于計時器方法動畫持續(xù)時間 ?
@property (assign,nonatomic) BOOL timerAnimation;
@end
//左右內(nèi)容的最大偏移量
#define OFFSET_MAX ([UIScreen mainScreen].bounds.size.width-64)*0.9
@implementation CustomScrollView
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self.scrollViewHeight = frame.size.height;
[self addSubview:self.backImageView];
[self addSubview:self.scrollView];
[self addSubview:self.pageControl];
[self.backImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.with.mas_equalTo(self);
}];
[self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.with.mas_equalTo(self);
}];
[self.pageControl mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.bottom.mas_equalTo(self);
make.height.mas_equalTo(@20);
}];
self.timer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
[self.timer setFireDate:[NSDate dateWithTimeIntervalSinceNow:5]];
}
return self;
}
- (NSArray *)imageArr {
if (!_imageArr) {
_imageArr = @[@"timg-0",@"timg-1",@"timg-2"];
}
return _imageArr;
}
- (UIImageView *)backImageView {
if (!_backImageView) {
_backImageView = [[UIImageView alloc] init];
_backImageView.image = [UIImage imageNamed:@"bg_home"];
}
return _backImageView;
}
- (UIScrollView *)scrollView {
if (!_scrollView) {
_scrollView = [[UIScrollView alloc] init];
_scrollView.showsVerticalScrollIndicator = NO;
_scrollView.showsHorizontalScrollIndicator = NO;
_scrollView.contentSize = CGSizeMake(kScreenWidth+2*OFFSET_MAX, self.scrollViewHeight);
[_scrollView setContentOffset:CGPointMake(OFFSET_MAX, 0)];
_scrollView.bounces = NO;
_scrollView.delegate = self;
_leftIamgeView = [[UIImageView alloc] init];
_leftIamgeView.image = [UIImage imageNamed:self.imageArr[0]];
_leftIamgeView.layer.cornerRadius = 5;
_leftIamgeView.layer.masksToBounds = YES;
_middleImageView = [[UIImageView alloc] init];
_middleImageView.image = [UIImage imageNamed:self.imageArr[1]];
_middleImageView.layer.cornerRadius = 5;
_middleImageView.layer.masksToBounds = YES;
_rightImageView = [[UIImageView alloc] init];
_rightImageView.image = [UIImage imageNamed:self.imageArr[2]];
_rightImageView.layer.cornerRadius = 5;
_rightImageView.layer.masksToBounds = YES;
[_scrollView addSubview:_leftIamgeView];
[_scrollView addSubview:_middleImageView];
[_scrollView addSubview:_rightImageView];
[_leftIamgeView mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake((kScreenWidth-64)*0.9, self.scrollViewHeight*0.9));
make.centerY.mas_equalTo(_scrollView);
make.right.mas_equalTo(_middleImageView.mas_left).offset(-20);
}];
[_middleImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(kScreenWidth-64, self.scrollViewHeight));
make.centerY.mas_equalTo(_scrollView);
make.left.mas_equalTo(_scrollView).offset(OFFSET_MAX+64/2);
}];
[_rightImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(_leftIamgeView);
make.centerY.mas_equalTo(_scrollView);
make.left.mas_equalTo(_middleImageView.mas_right).offset(20);
}];
}
return _scrollView;
}
- (UIPageControl *)pageControl {
if (!_pageControl) {
_pageControl = [[UIPageControl alloc] init];
_pageControl.numberOfPages = self.imageArr.count;
_pageControl.enabled = NO;
_pageControl.currentPage = 0;
_pageControl.hidesForSinglePage = YES;
_pageControl.pageIndicatorTintColor = [UIColor whiteColor];
_pageControl.currentPageIndicatorTintColor = MAINCOLOR;
}
return _pageControl;
}
#pragma mark ------------ UIScrollViewDelegate --------
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (self.timerAnimation) {
return;
}
CGFloat offScale = scrollView.contentOffset.x - OFFSET_MAX;
if (offScale < 0) {
//右滑
self.leftIamgeView.layer.transformScale = 1 + 1.0/9*(fabs(offScale)/OFFSET_MAX);
self.middleImageView.layer.transformScale = 1 - 0.1*(fabs(offScale)/OFFSET_MAX);
} else {
//左滑
self.rightImageView.layer.transformScale = 1 + 1.0/9*(fabs(offScale)/OFFSET_MAX);
self.middleImageView.layer.transformScale = 1 - 0.1*(fabs(offScale)/OFFSET_MAX);
}
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
CGPoint offset = scrollView.contentOffset;
self.offsetX = offset.x;
if ((fabs(self.offsetX-OFFSET_MAX) >= OFFSET_MAX*0.5)) {
if (!decelerate) {
//替換圖片
[self exchangeImage];
}
} else {
//回彈復(fù)位
[scrollView setContentOffset:CGPointMake(OFFSET_MAX, 0) animated:YES];
self.leftIamgeView.layer.transform = CATransform3DIdentity;
self.middleImageView.layer.transform = CATransform3DIdentity;
self.rightImageView.layer.transform = CATransform3DIdentity;
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
//替換圖片
[self exchangeImage];
}
#pragma mark ---------- exchangeImage ------
//替換圖片
- (void)exchangeImage {
if (self.offsetX-OFFSET_MAX < 0) {
//右滑
UIImage *rightImage = self.rightImageView.image;
self.rightImageView.image = self.middleImageView.image;
self.middleImageView.image = self.leftIamgeView.image;
self.leftIamgeView.image = rightImage;
if (self.pageControl.currentPage - 1 < 0) {
self.pageControl.currentPage = self.pageControl.numberOfPages-1;
} else {
self.pageControl.currentPage -= 1;
}
} else {
//左滑
UIImage *leftImage = self.leftIamgeView.image;
self.leftIamgeView.image = self.middleImageView.image;
self.middleImageView.image = self.rightImageView.image;
self.rightImageView.image = leftImage;
if (self.pageControl.currentPage + 1 >= self.pageControl.numberOfPages) {
self.pageControl.currentPage = 0;
} else {
self.pageControl.currentPage += 1;
}
}
[self.scrollView setContentOffset:CGPointMake(OFFSET_MAX, 0)];
self.leftIamgeView.layer.transform = CATransform3DIdentity;
self.middleImageView.layer.transform = CATransform3DIdentity;
self.rightImageView.layer.transform = CATransform3DIdentity;
}
#pragma mark ---------- timer --------
- (void)timerAction {
self.offsetX = kScreenWidth+OFFSET_MAX-64;
self.timerAnimation = YES;
[UIView animateWithDuration:0.8 animations:^{
[self.scrollView setContentOffset:CGPointMake(self.offsetX, 0)];
self.rightImageView.layer.transformScale = 10/9.0;
self.middleImageView.layer.transformScale = 0.9;
} completion:^(BOOL finished) {
self.timerAnimation = NO;
[self exchangeImage];
self.rightImageView.layer.transform = CATransform3DIdentity;
self.middleImageView.layer.transform = CATransform3DIdentity;
}];
}
@end
最后調(diào)用:
self.scrollView = [[CustomScrollView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 170)]; [self.view addSubview:self.scrollView];
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
IOS self和super詳解實現(xiàn)原理及區(qū)別
這篇文章主要介紹了iOS self和super詳解實現(xiàn)原理及區(qū)別的相關(guān)資料,這里不僅說明區(qū)別并介紹實現(xiàn)原理,具有參考價值,需要的朋友可以參考下2016-12-12
iOS輸入框的字?jǐn)?shù)統(tǒng)計/最大長度限制詳解
在開發(fā)中經(jīng)常會遇到鍵盤輸入的字符長度的限制,下面這篇文章主要給大家介紹了關(guān)于iOS輸入框的字?jǐn)?shù)統(tǒng)計/最大長度限制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06
混合棧跳轉(zhuǎn)導(dǎo)致Flutter頁面事件卡死問題解決
這篇文章主要為大家介紹了混合棧跳轉(zhuǎn)導(dǎo)致Flutter頁面事件卡死問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
IOS中MMDrawerController第三方抽屜效果的基本使用示例
這篇文章主要介紹了IOS中MMDrawerController第三方抽屜效果的基本使用示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-02-02
利用iOS開發(fā)實現(xiàn)翻轉(zhuǎn)撲克牌動畫的方法
這篇文章主要給大家介紹了關(guān)于利用iOS開發(fā)實現(xiàn)翻撲克牌動畫的方法,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。2017-07-07
快速解決低版本Xcode不支持高版本iOS真機(jī)調(diào)試的問題方法
這篇文章主要介紹了快速解決低版本Xcode不支持高版本iOS真機(jī)調(diào)試的問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02

