iOS之移動中變化的cell(cell逐漸變大效果)
在開發中靈活使用cell可以省去不少麻煩, 這裡介紹如何讓cell隨著偏移量動態改變大小的效果.期間使用過重新整理固定cell, 和操作cell的座標, 整體做起來效果不佳而且非常麻煩, 這裡使用間接方法實現操作。
- 看一下效果先
![2043838-802ec68356e02cce.gif](https://i.iter01.com/images/b9941f0984f790042fe5781d3f4f07368e283d372db8db0c12880c0654458f84.gif)
cell移動效果.gif
看一下程式碼
//設定cell的上下內邊距
self.tableV.contentInset = UIEdgeInsetsMake(SCellHeight, 0, self.view.frame.size.height - BCellHeight, 0);
- 這裡要注意tableview的初始化,需要對內邊距進行這是,這時候tableview的偏移量會是-SCellHeight的大小。裡面的資料需要自己多列印才能準確計算,這裡不做過多說明
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
//在滑動過程中獲取當前顯示的所有cell, 呼叫偏移量的計算方法
[[self.tableV visibleCells] enumerateObjectsUsingBlock:^(MoveCell * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
//cell偏移設定
[obj cellOffsetOnTabelView:self.tableV];
}];
}
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
//cell第一次出現時呼叫計算偏移量
MoveCell *getCell = (MoveCell *)cell;
[getCell cellOffsetOnTabelView:tableView];
}
- 在vc控制器裡在移動cell的觸發方法中與cell將要出現的方法裡需要對cell的位置進行判斷,對滿足條件的cell進行偏移量進行設定。其他正常的正常
- 接下來進入到自定義的cell中,這裡為MoveCell看一下初始化中新增了什麼
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
//取消cell點選的效果
self.selectionStyle = UITableViewCellSelectionStyleNone;
self.imageV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, SCellHeight)];
[self.contentView addSubview:self.imageV];
self.label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, SCellHeight)];
self.label.numberOfLines = 0;
self.label.font = [UIFont systemFontOfSize:FontSize];
self.label.textAlignment = NSTextAlignmentCenter;
[self.contentView addSubview:self.label];
self.label.text = @"改變字型大小";
//新增點選方法
UITapGestureRecognizer *tapG = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
[self.imageV addGestureRecognizer:tapG];
}
return self;
}
- (void)tapAction:(UIGestureRecognizer *)gestur
{
NSLog(@"點選了%ld", gestur.view.tag);
}
- (void)cellOffsetOnTabelView:(UITableView *)tabelView
{
CGFloat currentLocation = tabelView.contentOffset.y + BCellHeight;
//如果超出規定的位置以 ->“上”
if (self.frame.origin.y < tabelView.contentOffset.y + BCellHeight - SCellHeight) {
self.imageV.height = BCellHeight;
self.imageV.y = - (BCellHeight - SCellHeight);
self.label.font = [UIFont systemFontOfSize:FontSize * 4];
}else if (self.frame.origin.y <= currentLocation && self.frame.origin.y >= tabelView.contentOffset.y) {
//cell開始進入規定的位置
//通過絕對值 取出移動的Y值
CGFloat moveY = ABS(self.frame.origin.y - currentLocation) / SCellHeight * (BCellHeight - SCellHeight);
[[self superview] bringSubviewToFront:self];
//移動的值 + cell固定高度
self.imageV.height = SCellHeight + moveY;
self.label.height = SCellHeight + moveY;
//設定偏移量Y值
self.label.y = - moveY;
self.imageV.y = - moveY;
//通過move改變字型的大小 倍數 與起始變化位置自己定義 這裡以最大值4倍計算
if (BCellHeight - SCellHeight > moveY && moveY > 20) {
self.label.font = [UIFont systemFontOfSize:FontSize * moveY / 20];
} else if (moveY <= 20)
{
self.label.font = [UIFont systemFontOfSize:FontSize];
} else {
self.label.font = [UIFont systemFontOfSize:FontSize * 4];
}
}else{
//超出規定的位置以 ->“下”
self.imageV.height = SCellHeight;
self.imageV.y = 0;
self.label.font = [UIFont systemFontOfSize:FontSize];
}
}
![2043838-b38523f200f9a124.png](https://i.iter01.com/images/10ea30daa715768672449919655cd6467c722965cc6d38cfb4e30bb7a436a64f.png)
Paste_Image.png
這裡這個方法取消cell的點選效果,因為改變座標的原因cell的點選方法並不準確,用手勢來替代點選方法,需要注意的就是點選時候需要知道點選的是第幾個要為imageview新增tag值,建議在返回cell中,當然也可以在cell將要出現的方法中
![2043838-b3dc7b469c9c2479.png](https://i.iter01.com/images/bb088b7ce472f44527e2cbade12bb85b8d8a626f86c1edc786cdec98e7203b56.jpg)
frame.png
- 這裡強調一下,因為本身
self.view.frame.origin.x
self.view.frame.origin.y
self.view.frame.size.height
self.view.frame.size.width
這些屬性本身是屬於可讀不可改的,所以這裡給view新增一個類目可以方便修改尺寸與計算- (void)cellOffsetOnTabelView:(UITableView *)tabelView
- 主要的計算都在這個方法,首先要知道你所控制的cell什麼時候達到你的條件,
本文設計的是始終保持一個完整的最大cell保持在螢幕上,從開始移動到移動結束路程為 2 * (BCellHeight - SCellHeight)那麼如何判斷達到這個條件可以用cell的frame中的y,y的值是固定一直保持不變的,這一個固定量就是計算的關鍵了。這裡設定的是第二個cell的y為界限, 上限是cell距離最上端距離最大值與最小值的差。這裡的計算需要自己多列印幾次進行比較就會明白。還有一點計算移動的距離同樣要進行計算,對於計算題就不進行詳細說明。大家可以參考本文的方式來調整到自己的預計效果!
這裡主要提供一個類似效果的思路,具體實踐可根據個人要求進行改進。如果有人發現更簡便的方法可以交流,希望可以幫助到你!
附上Demo僅供參考!
相關文章
- IOS 動態改變cell的高度iOS
- iOS 中 cell的用法iOS
- iOS初級開發學習筆記:tablevView中,點選cell後下部彈出下級列表,需實現cell高變化iOS筆記View
- SVG 漸變動畫效果SVG動畫
- Swift iOS : self sized cellSwiftiOSZed
- Swift iOS : 定製CellSwiftiOS
- canvas具有漸變效果的矩形Canvas
- iOS CAGradientLayer漸變色iOS
- iOS UIView漸變色iOSUIView
- IOS多型別Cell的tableView實現iOS多型型別View
- JavaScript透明度漸變效果JavaScript
- CSS透明度漸變效果CSS
- 使用 CSS 實現漸變效果CSS
- 一對一直播原始碼逐漸變為生活中的主角原始碼
- Rust的Cell、RefCell和OnceCell:靈活且安全的內部可變性Rust
- 【譯】React Native中的動畫漸變React Native動畫
- cell label autoLayout
- 直播原始碼,懸浮窗滾動漸變色效果原始碼
- iOS Cell巢狀UIWebView(內附UIWebView詳解)iOS巢狀UIWebView
- Photoshop中的漸變工具
- css奇技淫巧-色彩漸變與動態漸變CSS
- Cell子刊:清晨或傍晚運動,效果竟然大不相同!
- iOS 繪製漸變·基礎篇iOS
- canvas繪製帶有漸變效果的直線Canvas
- iOS 產品新需求,要讓collectionView 的背景跟著Cell 一塊兒動!!!iOSView
- Robust mapping of spatiotemporal trajectories and cell–cell interactions in healthy and diseased tissues論文介紹APP
- iOS兩種顏色的線性漸變 --DDGBannerScrollViewiOSView
- Dreamweaver製作滑鼠經過圖片漸漸變暗效果教程
- 移動的“豹變”
- Flutter 中漸變的高階用法Flutter
- CSS3背景漸變效果程式碼例項CSSS3
- CSS3文字顏色漸變效果CSSS3
- 漸變邊框文字效果?CSS 輕鬆拿捏!CSS
- 簡易的iOS導航欄顏色漸變方案iOS
- Cell smart table scan等待事件事件
- iOS11 標題滾動變化iOS
- Swift iOS : 如果Cell內部有webview怎麼自適應呢SwiftiOSWebView
- 網頁影像漸變的方法(HTML+CSS) (漸變與切換)網頁HTMLCSS
- 使用canvas來完成線性漸變和徑向漸變的功能Canvas