用drawRect的方式實現一個尺子,drawrect實現尺子
用drawRect的方式實現了一個尺子選取器,demo在這裡:https://github.com/Phelthas/LXMRulerView效果 如果不考慮複用的問題,我感覺最簡單的實現方式其實是讓美術做一張尺子的圖片,放到scrollView上就可以了,數值可以根據scrollview的contentOffset來計算。如果考慮複用的問題,還是用代碼寫來的方便,封裝一些屬性,就可以實現很多不同的樣式。所以就有了這個LXMRulerView~ 實現方案:目前用的是一個比較笨的實現方案,就是用drawRect的方式畫了一個尺子,然後把這個view放到scrollview上,然後用scrollview的contentOffset來計算數值。有看到資料說用drawRect的方式會比較占記憶體,用CALayer實現會好很多,這個我還沒有試,但目前來看demo裡面記憶體佔用都很小,有空試一下layer的實現方式吧~為什麼說這個方案比較笨呢?因為這裡面其實是完完全全畫了一個完整的尺子,沒有複用任何資源,所以理論上如果尺子很長很長的話,還是會很消耗記憶體的;考慮到尺子也是不斷重複的外觀,只有數字不一樣,所以理論上用一個橫向的collectionView來實現會更好一些,這個有空實踐一下看看效果怎麼樣吧~ 需要注意的地方:1,對autoLayout的支援和從xib初始化的支援drawRect是按bounds來畫圖的,而且預設情況下drawRect方法只會調用一次。所以如果從xib初始化,且初始化時的view大小與最終顯示的view大小不同的話,drawRect是按最初初始化的大小來繪製的,不會隨著autoLayout調整大小,所以這裡沒有什麼好的辦法,只能在layoutSubview中手動調整改view的大小。但僅僅調整view大小還不夠,畫好的圖預設不會重新繪製,UIView有一個contentMode屬性,需將其設定為UIViewContentModeRedraw,效果是在view的bounds有變化時,會重新調用drawRect方法。 2,整數吸附效果在scrollviewDidScroll的方法中調整contentOffset來使其停留在整數的位置上的方法太low了!!!會使動畫效果看起來很不連貫怎麼解決呢?就是用
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inoutCGPoint *)targetContentOffset這個方法,這也是系統提供的delegate方法,所以可以放心用,效果就是可以讓scrollview剛好停留在
targetContentOffset的位置,所以只需要在這個方法中計算出指定的位置就可以了~具體用法參考我之前的部落格(UIScrollView的delegate方法妙用之讓UICollectionView滑動到某個你想要的位置 ) 3,數值變化的回調為了簡單易用,數值變化的回調方法是用block的方式。在用的時候,需要注意一下循環參考的問題,所以block中還是用weakSelf安全一點 4,為了保證滑動位置的準確度,尺子最大最小值和間距都只支援整型,不支援浮點數~~等想到好解決辦法支援~ 目前還在持續更新中,有什麼問題歡迎討論~