子控件懸停及scrollView細節

UIScrollView、控件懸停、頂部圖下拉放大效果、UITouch事件

UIScrollView的基本屬性

  • 超出UIScrollView邊框的內容會被自動隱藏
  • contentSize
    • 設置scrollView的contentSize屬性,告訴UIScrollView所有內容的尺寸,也就是告訴它滾動范圍(最多能滾多遠)
    • UIScrollView無法滾動的可能原因
      • 沒有設置contentSize
      • scrollEnabled = NO;
      • 禁止了觸摸事件:userInteractionEnabled = NO
    • 如果想要禁止某個方向的滾動,那么就可以直接設置這個方向的contentSize為0
      eg:

// 禁止水平方向上滾動
self.scrollView.contentSize = CGSizeMake(0, 500);
contentOffset:(偏移量)

  • 記錄UIScrollView滾動的位置,也就是內容的左上角和scrollView自身左上角X\Y的差值
    • 對于X\Y值,如果內容往左上方滾動,X\Y都是增加,如果內容往右下方滾動,X\Y都是減少
      eg:

// 往下移動64
self.scrollView.contentOffset = CGPointMake(0, -64);

OC語法細節:OC不允許直接修改結構體對象的屬性成員變量

contentInset:內邊距

  • 這個屬性能夠在UIScrollView的四周增加額外的滾動區域,一般用來避免scrollView的內容被其他控件擋住(比如不被導航條擋住)
    eg:

// 頂部多出64的內邊距
self.scrollView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
UIScrollView的其他屬性

  • BOOL bounces
    • 設置UIScrollView是否需要彈簧效果
  • BOOL scrollEnabled
    • 設置UIScrollView是否能滾動
  • BOOL showHorizontalScrollIndicator
    • 是否顯示水平滾動條
  • BOOL showsVerticalScrollIndicator
    • 是否顯示垂直滾動條
  • BOOL pagingEnabled
    • 是否分頁
      注意

iOS7以后,導航控制器會為其中的scrollView的頂部自動添加64的內邊距,如果想去掉,可以通過下列屬性去掉
tabBarController為間隔區域的bottom添加49
取消自動添加額外滾動區域

self.automaticallyAdjustsScrollViewInsets = NO;
UIScrollView的代理方法

使用方法

首先準守<UIScrollViewDelegate>協議
設置代理
實現代理方法
注意
如果其他類(A類)成為該類中UIScrollView的代理的話,需要將 A類設成Strong,然后它成為當前類中scrollView的代理
常用代理方法為

/**
 *  滾動的時候調用
 */
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{

}

/**
 *  即將開始拖拽的時候調用
 */
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{

}

/**
 *  結束拖拽的時候調用
 */
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{

}

/**
 *  (減速完畢)停止滾動的時候調用
 */
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{

}
scrollView實現內容縮放
// 最大縮放比例
self.scrollView.maximumZoomScale = 2.0;
// 最小縮放比例
self.scrollView.minimumZoomScale = 0.2;

// 同時實現代理方法
// 返回要縮放的內容控件,注意,該內容控件必須是scrollView的子控件
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return self.imageView;
}

// 這個方式是內容縮放的時候調用,通過在該方法中調節內容控件的frame可以使縮放的時候內容控件始終處于scrollView的正中間
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{

}

其他方法
// 將scrollView中的所有子控件都執行removeFromSuperview方法
[scrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
ScrollView內部子控件添加約束的注意點

子控件的尺寸不能通過UIScrollView來計算,可以考慮通過以下方式計算

可以設置尺寸為固定值
可以相對于UIScrollView以外的其他控件來計算尺寸
UIScrollView的frame應該通過子控件以外的其他控件來計算

UIScrollView的contentSize的尺寸是通過子控件來計算的
根據子控件的尺寸以及子控件與UIScrollView之間的間距
ScrollView的一些特效效果

控件懸停效果

當scrollView往上拖拽到某一個位置的時候,控件(testView)懸停到某一個位置,當scrollView往下拉的時候,該控件(testView)又隨著scrollView一起移動
實現思路:

當往上拖拽到一定位置的時候(通過計算偏移量來判斷),讓該控件(testView)添加到self.view上,并設置該控件(testView)的frame固定到該位置,當scrollView再次往回拖拽到該位置的時候,再讓該控件(testView)再添加到scrollView上,成為scrollView的子控件

頂部圖片下拉放大效果

當scrollView往下拖拽的時候,讓頂部的imageView按比例放大
實現思路:

當scrollView往下拖拽的時候,通過偏移量來修改頂部imageView的transform(縮放的transform)。

eg:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGFloat imageH = self.imageView.frame.size.height;
    CGFloat offsetY = scrollView.contentOffset.y;
    // 該判斷是實現scrollView內部的子控件懸停效果
    if (offsetY >= imageH) {
        // 將紅色控件添加到控制器的view中,設置Y值為0
        CGRect redF = self.redView.frame;
        redF.origin.y = 0;
        self.redView.frame = redF;
        [self.view addSubview:self.redView];
    }else{
        // 將紅色控件添加到scrollView中,設置Y值為圖片的高度
        CGRect redF = self.redView.frame;
        redF.origin.y = 140;
        self.redView.frame = redF;
        [self.scrollView addSubview:self.redView];
    }

    // 實現下拉放大頂部圖片效果
    CGFloat scale = 1 - (offsetY / 70);
    scale = (scale >= 1) ? scale : 1;
    self.imageView.transform = CGAffineTransformMakeScale(scale, scale);
}

分頁指示器UIPageControl

UIPageControl
顏色指示器
tintColor: 其他頁面的指示顏色
currentPageIndicatorTintColor:當前頁顏色
numberOfPages:總共有多少頁
注意 一定不要將UIPageControl放到UIScrollView里,這樣的話UIScrollView的內容拖動的時候容易把UIPageControl拖走

pageControl.hidesForSinglePage = YES;
當只有一頁時自動隱藏pageControl
關于UIScrollView不能響應UITouch事件的解決辦法

原因是:UIView的touch事件被UIScrollView捕獲了。

解決辦法:讓UIScrollView將事件傳遞過去。于是最簡單的解決辦法就是加一個UIScrollView的category。這樣每個用到UIScrollView的地方只要導入這個category就可以直接響應相關的touch事件了。

#import "UIScrollView+UITouch.h"

@implementation UIScrollView (UITouch)

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
  [[self nextResponder] touchesBegan:touches withEvent:event];
  [super touchesBegan:touches withEvent:event];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
  [[self nextResponder] touchesMoved:touches withEvent:event];
  [super touchesMoved:touches withEvent:event];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
  [[self nextResponder] touchesEnded:touches withEvent:event];
  [super touchesEnded:touches withEvent:event];
}

@end
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379

推薦閱讀更多精彩內容