UI基礎:UIScrollView

常用屬性

contentSize 內容尺寸

contentOffset 偏移量

contentInset 內邊框

delegate 監(jiān)聽滾動

viewForZoomingInScrollView: 縮放

項目:輪播廣告

looper.gif

第一步 新建一個類MOBLoopSrollView繼承自UIView,包含:

一個scrollView, 顯示輪播圖片
一個pageControl, 指示當前頁
一個images, 接收將來需要顯示的圖片

提供一個工廠方法用于創(chuàng)建控件,可自行選擇使用xib或者代碼創(chuàng)建

/**
 創(chuàng)建輪播器

 @return 輪播器
 */
+ (MOBLoopScrollView *)loopScrollView
{
   return  [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] lastObject];
}

一些初始化工作

# pragma mark - 一些初始化操作
- (void)setup
{
    // 開啟翻頁
    self.scrollView.pagingEnabled = YES;
    // 隱藏水平滾動條
    self.scrollView.showsHorizontalScrollIndicator = NO;
    // 設置代理以監(jiān)聽滾動
    self.scrollView.delegate = self;
}

// 使用xib創(chuàng)建調用
- (void)awakeFromNib
{
    [super awakeFromNib];
    [self setup];
}

// 使用代碼創(chuàng)建時調用
- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        [self setup];
    }
    
    return self;
}

重寫setter,給scrollView添加iamgeView,并設置pageControl的數(shù)量

/**
 重寫setter,給scroolView 添加 imageView

 @param images 傳入的圖片數(shù)組
 */
- (void)setImages:(NSArray *)images
{
    _images = images;
    
    // 清空  防止多次對scrollView賦值造成多余數(shù)據(jù)
    [self.scrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
    
    NSInteger count = images.count;
    
    for (int i = 0; i < count; i++) {
        
        UIImageView *imageView = [[UIImageView alloc] init];
        imageView.image = images[i];
        [self.scrollView addSubview:imageView];
        
    }
    
    self.pageControl.numberOfPages = count;
}

重寫layoutSubviews,設置所有控件的frame

/**
 設置frame
 */
- (void)layoutSubviews
{
    [super layoutSubviews];
    
    // 設置scrollView
    self.scrollView.frame = self.bounds;
    
    CGFloat scrollW = self.scrollView.frame.size.width;
    CGFloat scrollH = self.scrollView.frame.size.height;
    
    // 設置contentSize
    self.scrollView.contentSize = CGSizeMake(self.images.count * scrollW, 0);
    
    for (int i = 0; i < self.images.count; i++) {
        UIImageView *imageView = self.scrollView.subviews[i];
        imageView.frame = CGRectMake(scrollW * i, 0, scrollW, scrollH);
    }

    // 設置pageControl
    CGFloat pageW = 100;
    CGFloat pageH = 20;
    CGFloat pageX = scrollW - pageW;
    CGFloat pageY = scrollH - pageH;
    self.pageControl.frame = CGRectMake(pageX, pageY, pageW, pageH);
}

通過代理方法監(jiān)聽滾動,設置pageControl的值

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    // 監(jiān)聽滾動的幅度判斷頁面指示器
    self.pageControl.currentPage = (int)(scrollView.contentOffset.x / scrollView.frame.size.width + 0.5);
}

創(chuàng)建定時器,在初始化中開啟,并在開始拖拽時停止,停止拖拽后再開啟

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self stopTimer];
}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    [self startTimer];
}


# pragma mark - 定時器
- (void)startTimer
{
    // 創(chuàng)建定時器
    self.timer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(nextPage) userInfo:nil repeats:YES];
//    // 定時器開始
//    [self.timer fire];
    // 防止其他控件干擾
    [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}

- (void)stopTimer
{
    // 停止定時器
    [self.timer invalidate];
    self.timer = nil;
}

/**
 offset.x = 頁數(shù) * scrollView的寬度
 注意到最后一張需要回到第一張
 */
- (void)nextPage
{
    NSUInteger index = self.pageControl.currentPage + 1;
    
    // 如果是最后一頁則回到第一頁
    if (index == self.pageControl.numberOfPages) {
        index = 0;
    }
    
    // 對象的結構體屬性的值不可以直接修改,需要先賦值給另外一個結構體修改后重新賦值回來
    CGPoint offset = self.scrollView.contentOffset;
    offset.x = self.scrollView.frame.size.width * index;
    [self.scrollView setContentOffset:offset animated: YES];
    
}

項目源碼

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末匿情,一起剝皮案震驚了整個濱河市备绽,隨后出現(xiàn)的幾起案子颂斜,更是在濱河造成了極大的恐慌袱蜡,老刑警劉巖昆烁,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件势篡,死亡現(xiàn)場離奇詭異镀虐,居然都是意外死亡突照,警方通過查閱死者的電腦和手機轴总,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門直颅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怀樟,你說我怎么就攤上這事功偿。” “怎么了往堡?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵械荷,是天一觀的道長。 經(jīng)常有香客問我虑灰,道長吨瞎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任穆咐,我火速辦了婚禮颤诀,結果婚禮上,老公的妹妹穿的比我還像新娘对湃。我一直安慰自己崖叫,他們只是感情好,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布拍柒。 她就那樣靜靜地躺著心傀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拆讯。 梳的紋絲不亂的頭發(fā)上剧包,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機與錄音往果,去河邊找鬼。 笑死一铅,一個胖子當著我的面吹牛陕贮,可吹牛的內容都是我干的。 我是一名探鬼主播潘飘,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼肮之,長吁一口氣:“原來是場噩夢啊……” “哼掉缺!你這毒婦竟也來了?” 一聲冷哼從身側響起戈擒,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤眶明,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后筐高,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搜囱,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年柑土,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜀肘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡稽屏,死狀恐怖扮宠,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情狐榔,我是刑警寧澤坛增,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站薄腻,受9級特大地震影響收捣,放射性物質發(fā)生泄漏。R本人自食惡果不足惜被廓,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一坏晦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嫁乘,春花似錦昆婿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挎春,卻和暖如春看疙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背直奋。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工能庆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脚线。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓搁胆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子渠旁,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內容

  • 掌握 UIScrollView的常見屬性 UIScrollView的常用代理方法 UIScrollView的縮放 ...
    JonesCxy閱讀 2,737評論 1 12
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫攀例、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,124評論 4 61
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,324評論 25 707
  • 我的記憶里,媽媽是一個特別不拘小節(jié)的人杂靶,喜歡遵循自己的心思去做事情梆惯,別的媽媽熱衷給孩子報補習班的時候,她熱衷帶著我...
    妮妮是個小妮妮閱讀 305評論 1 2
  • 忽而頭頂一輪明亮的眸子 照亮心中的夢想 那一瞬間 全然的美好
    悅林閱讀 330評論 0 2