【iOS】APP仿写——ZARA

无限轮播图

无限轮播图的原理是在轮播的图片两边加上两个假页,通过判断是否到了这两个假页的位置,而后将滚动视图展示位置移动,从而可以实现视觉效果上的无限轮播效果
在这里插入图片描述
如图所示,当我插入三张图片时,两边的假页分别是第三、一张,这样一来,在展示时当移动到第五张时,函数检测后将滚动视图重置至第二张,就不会有间断效果,前面的移动也是如此。

self.scrollview = [[UIScrollView alloc] init];
    self.scrollview.frame = CGRectMake(0, [UIScreen mainScreen].bounds.size.height/2-200, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height-320);
    self.scrollview.pagingEnabled = YES;
    self.scrollview.scrollEnabled = YES;
    self.scrollview.contentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width * 5 , [UIScreen mainScreen].bounds.size.height / 2);
    for (int i = 0; i <= 5; i++) {
        NSString *strName = [NSString stringWithFormat:@"%d.JPG", (i % 3) + 1];
        // 创建图片
        UIImage *image = [UIImage imageNamed:strName];
        // 创建视图
        UIImageView *iView = [[UIImageView alloc] initWithImage:image];
        if (i == 5) {
            iView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height - 300);
        }
        else {
            iView.frame = CGRectMake([UIScreen mainScreen].bounds.size.width * (i + 1), 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height - 320);
        }
    // 将图片添加到滚动视图,不要添加到主视图
    [self.scrollview addSubview:iView];
    }
    [self.view addSubview:self.scrollview];
    // 设置初始偏移量到第二张图片
    [self.scrollview setContentOffset:CGPointMake([UIScreen mainScreen].bounds.size.width, 0) animated:NO];
    // 实现滚动到最后一张视图时,再次滚动能回到第一张视图
    self.scrollview.delegate = self;


- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    //当前滚动到的x位置
    CGFloat X = scrollView.contentOffset.x;
    //滚动视图展示宽度,即已经滚动过的宽度
    CGFloat screenWidth = CGRectGetWidth(scrollView.frame);
    //滚动视图内容的宽度,在我的视图中,就是5个屏幕的宽度
    CGFloat contentWidth = scrollView.contentSize.width;

    // 滚动到最后一张视图之后,将滚动位置重置到第二张图片;这样做的话,滚动视图位置被提前,就可以继续对视图进行从左到右的滚动
    if (X >= contentWidth - screenWidth) {
        [scrollView setContentOffset:CGPointMake(screenWidth, 0) animated:NO];
    }
    // 滚动到第一张视图之前,将滚动位置重置到倒数第二张图片;这样做的话,滚动视图位置被滞后,就可以继续对视图进行从右向左的滚动
    else if (X < screenWidth - scrollView.frame.size.width) {
        [scrollView setContentOffset:CGPointMake(contentWidth - 2 * screenWidth, 0) animated:NO];
    }
}

效果图

在这里插入图片描述

搜索

这个界面主要是写一个分栏控件和滚动视图滚动时对应的效果。能够使用分栏控件控制滚动视图,也能够用滚动视图控制分栏控件即可。在这里主要需要注意使用滚动视图控制分栏控件时,在页面滑动超过一半时,分栏控件就需要进行移动。
分栏控件协议:

- (void)segmentedControlValueChanged:(UISegmentedControl *)segmentedControl {
    // 获取当前选中的位置
    NSInteger selectedIndex = segmentedControl.selectedSegmentIndex;
    // 获取滚动视图
    UIScrollView *scrollView = self.scrollview;
    // 计算滚动视图的偏移量
    CGFloat X = selectedIndex * scrollView.bounds.size.width;
    CGFloat Y = scrollView.contentOffset.y;
    // 设置滚动视图的内容偏移量
    [scrollView setContentOffset:CGPointMake(X, Y) animated:YES];
}

滚动视图协议:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat contentOffsetX = scrollView.contentOffset.x;
    // 根据滚动视图的偏移量计算要切换的索引
    NSInteger selectedIndex = (double)(contentOffsetX / scrollView.frame.size.width + 0.5);//注意,这里0.5的意义是在滑动半张图片以上控件就会移到下一个位置
    // 获取到导航栏中的 UISegmentedControl
    UISegmentedControl *segmentedControl = self.seg;
    // 更新 UISegmentedControl 的索引
    if (selectedIndex != segmentedControl.selectedSegmentIndex) {
        segmentedControl.selectedSegmentIndex = selectedIndex;
    }
}

效果图:
在这里插入图片描述

我的界面

这个界面主要实现自定义cell,由于前面写过自定义cell的博客,这里就不过多讲解。
效果图:
在这里插入图片描述

总结

ZARA的仿写主要是为了给网易云做铺垫,难度并不算很高,主要复习使用了一下自定义cell,学习使用无限轮播图,在网易云音乐仿写中都有应用。

相关推荐

  1. 仿Vue的{{}}语法

    2024-07-22 09:04:02       22 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 09:04:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 09:04:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 09:04:02       45 阅读
  4. Python语言-面向对象

    2024-07-22 09:04:02       55 阅读

热门阅读

  1. SwiftUI革新:Xcode UI开发的新纪元

    2024-07-22 09:04:02       14 阅读
  2. leetcode -- 202.快乐数

    2024-07-22 09:04:02       20 阅读
  3. 自我学习的守护者:自监督目标检测的前沿探索

    2024-07-22 09:04:02       20 阅读
  4. 出口 与 无线

    2024-07-22 09:04:02       18 阅读
  5. Python3 第三十五课 -- 实例四

    2024-07-22 09:04:02       19 阅读
  6. 自动驾驶-定位概述

    2024-07-22 09:04:02       19 阅读
  7. 1.关于linux的命令

    2024-07-22 09:04:02       15 阅读
  8. 配置php-fpm服务

    2024-07-22 09:04:02       19 阅读
  9. 【机器学习框架TensorFlow和PyTorch】基本使用指南

    2024-07-22 09:04:02       16 阅读
  10. 华为eNSP模拟器安装

    2024-07-22 09:04:02       16 阅读
  11. HTTP协议的演进:从HTTP/1.0到HTTP/2.0

    2024-07-22 09:04:02       14 阅读
  12. 在Ubuntu 14.04上安装和使用Docker Compose的方法

    2024-07-22 09:04:02       16 阅读
  13. 【自动化机器学习AutoML】AutoML工具和平台的使用

    2024-07-22 09:04:02       16 阅读
  14. 【数据挖掘基础】数据挖掘技术概述和基本算法

    2024-07-22 09:04:02       17 阅读
  15. 常用传感器误差补偿方法介绍

    2024-07-22 09:04:02       16 阅读