標籤:des style blog http io ar color os 使用
A.需要掌握UIScrollView 是一個能夠滾動的視圖控制項,可以用來展示大量內容,如手機的“設定”1.常見屬性2.常用代理方法3.縮放4.UIScrollView和UIPageControl的分頁5.NSTime的使用 B.UIScrollView概念與使用練習:顯示大圖,以原始大小顯示一張圖片,可以滾動查看圖片的各個部分 原圖: 900 x 1305 1.拖入UIScrollView,加入一個ImageView,設定圖片,設定圖片尺寸 在controller中擷取到scrollView和圖片控制項 2.使用代碼設定UIScrollView的 contentSize 屬性,這是用來設定滾動範圍的
1 // 設定滾動範圍,這裡用圖片實際大小2 self.scrollView.contentSize = self.imageView.frame.size;
3.如果UIScrollView不能滾動,可能原因如下:(1)沒有設定contentSize(2)scrollEnable = NO(3)沒有接收到觸摸事件:userInteractionEnable = NO(4)沒有取消autolayout 拖動: 6.UIScrollView常見屬性
1 // 表示滾動位置,相對於初始位置2 @property(nonatomic) CGPoint contentOffset;3 4 // 表示尺寸、滾動範圍5 @property(nonatomic) CGSize contentSize;6 7 // 這個屬效能夠增加四周額外的滾動範圍8 @property(nonatomic) UIEdgeInsets contentInset;
(1)各類位置、尺寸: (2)額外邊距 Insets
1 // 增加邊距顯示,參數分別是top, left, bottom, right2 self.scrollView.contentInset = UIEdgeInsetsMake(10, 20, 40, 80);
(3)移動圖片
1 // 移動到(200, 300)位置2 self.scrollView.contentOffset = CGPointMake(200, 300);
7.其他屬性
1 // 是否需要彈簧效果 2 @property(nonatomic) BOOL bounces; 3 4 // 是否能夠滾動 5 @property(nonatomic,getter=isScrollEnabled) BOOL scrollEnabled; 6 7 // 顯示水平捲軸 8 @property(nonatomic) BOOL showsHorizontalScrollIndicator; 9 10 // 顯示垂直捲軸11 @property(nonatomic) BOOL showsVerticalScrollIndicator;
8.代理delegate(1)用處:監聽思想:讓一個對象A監聽另一個對象B的狀態通知思想:一個對象B狀態發生了改變,要通知對象A這裡A是B的代理,誰想監聽,誰就是代理 (2)使用UIScrollView內部的delegate對象,監聽事件,實現圖片大小的不斷轉換
1 @property(nonatomic,assign) id<UIScrollViewDelegate> delegate; // default nil. weak reference
(3)UIScrollView的代理(delegate)的任務:
- 設定UIScrollView在滾動過程某個特定位置、事件做一些特定的操作
- 必須監聽整個滾動過程
- 發生滾動時,發送訊息(調用方法)代理(delegate)對象
- 所以需要給UIScrollView設定一個delegate成員
所以要稱為UIScrollView的delegate必須實現以上方法,這些方法聲明在了UIScrollViewDelegate協議中,即要成為UIScrollView的delegate,必須遵守UIScrollViewDelegate協議。
(4)設定delegate三步驟:a.直接使用當前控制器作為delegate
1 #import <UIKit/UIKit.h>2 @interface ViewController : UIViewController <UIScrollViewDelegate>3 @end
b.指定UIScrollView的delegate
1 self.scrollView.delegate = self;
c.delegate實現方法 i.例如針對拖曳滾動的3個方法:
1 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { 2 NSLog(@"開始拖曳"); 3 } 4 5 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { 6 NSLog(@"正在拖曳"); 7 } 8 9 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {10 NSLog(@"結束拖曳");11 } ii.針對手勢縮放的3個方法
1 - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view { 2 NSLog(@"開始縮放"); 3 } 4 5 - (void)scrollViewDidZoom:(UIScrollView *)scrollView { 6 NSLog(@"正在縮放"); 7 } 8 9 - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {10 NSLog(@"結束縮放");11 } iii.拖曳後的減速(2個方法)
1 - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {2 NSLog(@"拖曳完成後減速開始");3 }4 5 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {6 NSLog(@"拖曳完成後減速完成");7 } 9.手勢縮放UIScrollView不僅能夠滾動顯示大量內容,還能對其內容進行縮放,所以只需要把要縮放的圖片放到UIScrollView中。一次只能縮放一個子控制項,UIScrollView通過使用delegate調用手勢方法,返回的就是指定要縮放的控制項
1 // 捏合手勢調用的方法2 - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;
這個方法返回的就是需要進行縮放的控制項
- 設定minimumZoomScale:縮小的最小比例
- 設定maximumZoomScale:放大的最大比例
實現步驟:(1)實現手勢調用方法
1 // 圖片2 @property (weak, nonatomic) IBOutlet UIImageView *imageView;3 4 // 縮放手勢調用的方法5 - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {6 return self.imageView; // 需要放大的ImageView7 }
(2)設定縮放比例
1 self.scrollView.maximumZoomScale = 2.0;2 self.scrollView.minimumZoomScale = 0.1;
(3)效果a.縮小b.放大 10.分頁例子就是案頭的APP列表,當APP數量超過一個螢幕,自動進行分頁 設定屬性pageEnable = YES,UIScrollView會被分割成多個獨立頁面,進行分頁顯示一般使用UIPageControl增強效果,UIPageControl常見屬性:
1 // 總頁數 2 @property(nonatomic) NSInteger numberOfPages; // default is 0 3 // 當前頁碼 4 @property(nonatomic) NSInteger currentPage; 5 // 只有一頁的時候隱藏頁碼 6 @property(nonatomic) BOOL hidesForSinglePage; // hide the the indicator if there is only one page. default is NO 7 // 其他頁碼指示顏色 8 @property(nonatomic,retain) UIColor *pageIndicatorTintColor; 9 // 當前頁碼指示顏色10 @property(nonatomic,retain) UIColor *currentPageIndicatorTintColor;
11.NSTimer定時器,功能:
- 在指定的時間執行指定的任務
- 每隔一段時間執行指定的任務
(1)調用以下方法開啟定時任務,然後調用 fire 方法執行:
1 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;2 3 - (void)fire;
每間隔ti秒執行一次aSelector方法,yesOrNo是否重複執行 (2)調用一下方法建立NSTimer,不用調用 fire 就會運行
1 + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;
(3)通過invalidate方法可以停止定時器的工作,但是不能再次執行,只能再重新建立一個新的定時器
1 // 永久終止工作2 - (void)invalidate;
另外有兩個類可以做定時任務:
- NSTimer:適合時間間隔比較大
- CADisplayLink:適合頻率比較高,做遊戲動畫用
(4)定時器在單線程下存在的問題 UI介面只能使用主線程重新整理,如果使用阻斷手段(例如定時器觸發畫面滑動,但是可以手動幹擾畫面移動),幹擾定時器的運行,就會阻止定時器的事件觸發,被阻止的事件累積之後會線上程資源得到解放之後觸發。 解決:當出現阻斷手段阻止了定時器觸發的時候,回收定時器,等得到線程資源之後再重新建立定時器。
[iOS基礎控制項 - 5.1] UIScrollView