国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS仿新聞tab標題欄效果

2020-07-26 02:26:17
字體:
來源:轉載
供稿:網友

iOS仿網易新聞之類的滑動標題欄,供大家參考,具體內容如下

預覽

思路

兩個scorllview,一個用于標題欄,一個擁有底下的page
標題欄文字和效果切換,漸變色和大小都是根據底下的page偏移量來歸一化換算的
小橫線直接加載標題欄所在的scorllview里面,小橫線自身要有局部偏移,根據page來切換
標題欄的居中需要算一個scrollview的偏移量,小橫線跟著scorllview偏移
監聽scrollview的滑動和停止滑動進行相應的處理

- (void)viewDidLoad{ [super viewDidLoad]; // Do any additional setup after loading the view. [self createTitleScrollView]; [self createButtonLine]; [self createContentScrollview];} #pragma mark - 初始化UI- (void)createTitleScrollView{ // 根據是否有導航欄調整坐標 CGFloat marginY = self.navigationController ? self.navigationController.view.frame.size.height : kUpMargin;  // 標題欄,包括小橫線的位置 _titleScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, marginY, kFrameWidth, kTitleHeight + kButtonLineHeight)]; _titleScrollView.showsHorizontalScrollIndicator = NO; _titleScrollView.bounces = NO; _titleScrollView.delegate = self; [self.view addSubview:_titleScrollView];  // 添加button NSArray *titleArray = @[@"頭條", @"社會", @"財經", @"科技", @"體育", @"娛樂", @"時尚", @"軍事", @"教育", @"游戲"]; _pageCount = titleArray.count; _titleScrollView.contentSize = CGSizeMake(kButtonWidth * _pageCount, kTitleHeight); for (int i = 0; i < _pageCount; i++) {  UIButton *titleBtn = [[UIButton alloc] initWithFrame:CGRectMake(kButtonWidth * i, 0, kButtonWidth, kTitleHeight)];  [titleBtn setTitle:titleArray[i] forState:UIControlStateNormal];  [titleBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];  titleBtn.titleLabel.font = [UIFont systemFontOfSize:16];  [titleBtn addTarget:self action:@selector(titleButtonClicked:) forControlEvents:UIControlEventTouchDown];  titleBtn.tag = 1000 + i; // button做標記,方便后面索引,為了不出沖突,就把這個數值設得大一些  [_titleScrollView addSubview:titleBtn]; };} - (void)createButtonLine{ // 初始時刻停在最左邊與按鈕對齊 _buttonLine = [[UIView alloc] initWithFrame:CGRectMake(0, kTitleHeight, kButtonWidth, kButtonLineHeight)]; _buttonLine.backgroundColor = [UIColor redColor]; // 小橫線加載scrollview上才能跟隨button聯動 [_titleScrollView addSubview:_buttonLine];} - (void)createContentScrollview{ CGFloat marginY = self.navigationController ? self.navigationController.view.frame.size.height : kUpMargin;  // 添加內容頁面 _contentScrollview = [[UIScrollView alloc] initWithFrame:CGRectMake(0, marginY + kTitleHeight + kButtonLineHeight, kFrameWidth, kFrameHeight - marginY - kTitleHeight - kButtonLineHeight)]; _contentScrollview.pagingEnabled = YES; _contentScrollview.bounces = NO; _contentScrollview.contentSize = CGSizeMake(kFrameWidth * _pageCount, kFrameHeight - marginY - kTitleHeight); _contentScrollview.showsHorizontalScrollIndicator = NO; _contentScrollview.delegate = self; [self.view addSubview:_contentScrollview];  // 添加分頁面 for (int i = 0; i < _pageCount; i++) {  PageViewController *pageViewController = [[PageViewController alloc] init];  UIButton *button = [_titleScrollView viewWithTag:1000 + i];  pageViewController.title = button.currentTitle;  pageViewController.view.frame = CGRectMake(kFrameWidth * i, 0, kFrameWidth, kFrameHeight - marginY - kTitleHeight);  [_contentScrollview addSubview:pageViewController.view]; }  // 初始化后選中某個欄目 [self titleButtonClicked:[_titleScrollView viewWithTag:1000 + 0]];} #pragma mark - 標題button點擊事件- (void)titleButtonClicked:(UIButton *)sender{ // 根據點擊的button切換頁面和偏移 printf("%s clicked/n", sender.currentTitle.UTF8String);  // 以下不用了,因為scroll切換會自動處理好尺寸和顏色了// for (int i = 0; i < _pageCount; i++)// {//  UIButton *button = [_titleScrollView viewWithTag:1000 + i];//  // 重置button尺寸顏色//  button.transform = CGAffineTransformMakeScale(1, 1);//  [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];// }  // 強調被選中的button // 放大聚焦 sender.transform = CGAffineTransformMakeScale(kMaxTitleScale, kMaxTitleScale); // 變色 [sender setTitleColor:[UIColor greenColor] forState:UIControlStateNormal];  // 居中title [self settleTitleButton:sender];  // 帶動畫切換到對應的內容,會觸發scrollViewDidScroll NSInteger pageIndex = sender.tag - 1000; [_contentScrollview setContentOffset:CGPointMake(kFrameWidth * pageIndex, 0) animated:YES];} #pragma mark - scrollview滑動事件- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ // 根據content內容偏移調整標題欄 if (scrollView == _titleScrollView) {  printf("title moved/n");     } else if (scrollView == _contentScrollview) {  printf("content moved/n");    // 獲得左右兩個button的索引, 注意最后取整  CGFloat offsetX = scrollView.contentOffset.x;  NSInteger leftTitleIndex = offsetX / kFrameWidth;  NSInteger rightTitleIndex = leftTitleIndex + 1;  // 因為設置了到邊不能滑動,所以不考慮邊界  UIButton *leftTitleButton = [_titleScrollView viewWithTag:1000 + leftTitleIndex];  UIButton *rightTitleButton = [_titleScrollView viewWithTag:1000 + rightTitleIndex];    // 設置大小和顏色漸變以及小橫線的聯動  // 權重因子 0~1 小數, 左邊和右邊互補  CGFloat rightTitleFactor = offsetX / kFrameWidth - leftTitleIndex;  CGFloat leftTitleFactor = 1 - rightTitleFactor;    // 尺寸  CGFloat maxExtraScale = kMaxTitleScale - 1;  leftTitleButton.transform = CGAffineTransformMakeScale(1 + leftTitleFactor * maxExtraScale, 1 + leftTitleFactor * maxExtraScale);  rightTitleButton.transform = CGAffineTransformMakeScale(1 + rightTitleFactor * maxExtraScale, 1 + rightTitleFactor * maxExtraScale);  // 顏色  UIColor *leftTitleColor = [UIColor colorWithRed:0 green:leftTitleFactor blue:0 alpha:1];  UIColor *rightTitleColor = [UIColor colorWithRed:0 green:rightTitleFactor blue:0 alpha:1];  [leftTitleButton setTitleColor:leftTitleColor forState:UIControlStateNormal];  [rightTitleButton setTitleColor:rightTitleColor forState:UIControlStateNormal];  // 小橫線位移  _buttonLine.frame = CGRectMake(kButtonWidth * (leftTitleIndex + rightTitleFactor), _buttonLine.frame.origin.y, kButtonWidth, kButtonLineHeight); }} - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ // 內容區塊滑動結束調整標題欄居中 if (scrollView == _contentScrollview) {  // 取得索引值  NSInteger titleIndex = scrollView.contentOffset.x / kFrameWidth;  // title居中  [self settleTitleButton:[_titleScrollView viewWithTag:1000 + titleIndex]]; }} #pragma mark - 標題按鈕和橫線居中偏移- (void)settleTitleButton:(UIButton *)button{ // 標題 // 這個偏移量是相對于scrollview的content frame原點的相對對標 CGFloat deltaX = button.center.x - kFrameWidth / 2; // 設置偏移量,記住這段算法 if (deltaX < 0) {  // 最左邊  deltaX = 0; } CGFloat maxDeltaX = _titleScrollView.contentSize.width - kFrameWidth; if (deltaX > maxDeltaX) {  // 最右邊不能超范圍  deltaX = maxDeltaX; } [_titleScrollView setContentOffset:CGPointMake(deltaX, 0) animated:YES]; }

源代碼下載

csdn:仿網易新聞tab效果

github:仿網易新聞tab效果

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 惠安县| 司法| 定襄县| 凤城市| 绥芬河市| 邹平县| 兴业县| 抚顺市| 富顺县| 云南省| 寻甸| 白山市| 阜宁县| 凌海市| 巴中市| 鸡泽县| 汶上县| 克拉玛依市| 阜南县| 辉南县| 商城县| 巩留县| 江源县| 延寿县| 马尔康县| 连州市| 乌恰县| 甘泉县| 德格县| 龙州县| 永福县| 寿光市| 九龙坡区| 喜德县| 赣榆县| 砚山县| 新营市| 含山县| 武川县| 朔州市| 土默特左旗|