UIKit之图片轮播器Demo

news2025/1/22 8:51:31

需求

实现图片轮播器,搭配页面指示器、可以自动轮播。
注意计时器优先级问题
在这里插入图片描述

分析

  1. 需要UIScrollView组件、指示器UIPageControl。此外自定义类需要实现代理
  2. 自动滚动需要监控当前屏幕的offsetx。
  3. 防止拖拽自动滚动时一下子翻滚太多的BUG:拖拽时,撤销当前timer,放开再创建新的timer。
  4. 注意计时器优先级问题,使用计时器,经常会出现被其它组件抢占线程的情况,所以代码要做出修改,修改消息循环中计时器的优先级。

实现

· 自定义类的创建:

#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN

@interface PicAutoPlayView : UIView<UIScrollViewDelegate>
@property (nonatomic, strong) UIScrollView *scrollView;
@property (nonatomic, strong) UIPageControl *pagecontrol;
// 为图片滚动拖住不放而自动滚动的记时也停止,需要在类中引用计时器:否则有BUG
// 弱引用即可,销毁不跟随此类:在开始拖拽的方法中实现
@property(weak, nonatomic) NSTimer *timer;
@end

NS_ASSUME_NONNULL_END

· 功能实现:

#import "PicAutoPlayView.h"

@implementation PicAutoPlayView

/*
 遇到问题:
    图片不显示:UIScrollView没有初始化
    图片像素太大,截一下
    
    此外,其它可滚动的同优先级组件在响应其它处理时,会影响当前自动滚动组件的计时器,因为主线程跑去执行那个任务了
        消息循环:
    // 获取当前消息循环对象
    NSRunLoop:让timer优先级和当前控件一样,即可。
    
 
 */


/*
 
 没有显示图片:
 输出一下sc坐标和imgview坐标
 */
-(instancetype) initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    // 其实scrollview整个就是加进的全部UIImageView
    _scrollView.backgroundColor = [UIColor grayColor];
    // scrollview没有初始化,半天找不到它
    _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(10, 0, self.frame.size.width-10, 220)];
    
    if(self){
        // 需要靠左10和靠右10,注意我这里的写法,怎么空开的,和下面的x坐标如何对应起来的
        CGFloat imgW = self.frame.size.width-20;
        CGFloat imgH = 200;

        for(int i = 0; i < 5 ; i++){
            UIImageView *imgview = [[UIImageView alloc]init];
            // 每个img的坐标
            CGFloat imgx = imgW*i+10*i;
            CGFloat imgy = 70;
            imgview.frame = CGRectMake(imgx, imgy, imgW, imgH);
            imgview.image = [UIImage imageNamed:[NSString stringWithFormat:@"img_%02d.png", i+1]];
            // finditem_ad.png
            [_scrollView addSubview:imgview];
        }
        
        // 设置滚动范围:  第二个位置传0表示:垂直方向不滚动
        CGFloat scrollW = _scrollView.frame.size.width*5;
        _scrollView.contentSize = CGSizeMake(scrollW, 0);
        
        //  实现分页效果:(很简单):分页按照UIScrollView的宽度来分,所以内部图片大小和UIScrollView宽度一致即可
        _scrollView.pagingEnabled = YES;
        // 隐藏横轴:
        _scrollView.showsHorizontalScrollIndicator = NO;
        
        
#pragma --mark  分页指示器设置
        // pagecontrol属于UIView,不属于scrollview,因为页面滚动时,指示器得浮在表层。它俩没有关系
        _pagecontrol = [[UIPageControl alloc] initWithFrame:CGRectMake(0, 185, self.bounds.size.width, 30)];
        _pagecontrol.numberOfPages = 5; // 设置总页数
        _pagecontrol.currentPage = 0;    // 设置当前显示的页数(默认为0)
        _pagecontrol.pageIndicatorTintColor = [UIColor grayColor]; // 设置非当前页小圆点的颜色
        _pagecontrol.currentPageIndicatorTintColor = [UIColor blueColor]; // 设置当前页小圆点的颜色
        // 设置滚动时指示器点位置的变化:需要检测滚动位置事件
        _scrollView.delegate = self;    // 代理
        
#pragma --mark  计时器实现自动滚动
        // 自动滚动:常用NSTimer方式:TimerWith、scheduleXXX,第一种需要手动添加到消息循环中,第二种是自动创建的
        // 每隔多久时间执行哪个方法: 时间间隔、执行哪个对象的哪个方法
        
        
        NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(scrollImage) userInfo:nil repeats:YES];
        self.timer = timer;
        NSRunLoop *runloop = [NSRunLoop currentRunLoop];
        // timer对象的优先级
        [runloop addTimer:self.timer forMode:NSRunLoopCommonModes];
        
     }
    
    [self addSubview:_scrollView];
    [self addSubview:_pagecontrol];
     return self;
 }

/*
 防止拖拽不动放开后 导致快速滑动的BUG:
 在拖拽开始和结束时,停止计时器、重开启计时器
 */
-(void) scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
    [self.timer invalidate];
}

//
-(void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    // 重新开一个计时器
    self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(scrollImage) userInfo:nil repeats:YES];
    
    
    // 再改变优先级:
    NSRunLoop *runloop = [NSRunLoop currentRunLoop];
    // timer对象的优先级
    [runloop addTimer:self.timer forMode:NSRunLoopCommonModes];
}

// 实现拖动滚动:做滚动位置监控
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // CGPoint offset = scrollView.contentOffset;
    // contentOffset包含了x、y,这里取x即可
    CGFloat offset = scrollView.contentOffset.x;
    int page = offset / scrollView.frame.size.width;
    _pagecontrol.currentPage = page;
}

/*
 自动滚动图片的方法:设置偏移值即可实现滚动
 通过变量页码来设置当前的偏移量
    如果页码到了最后一页,则设置页码为0,回第一页
 */
- (void)scrollImage{
    // NSInteger:适合跨平台
    NSInteger page = _pagecontrol.currentPage;
    // 尾页则回到第一页
    if(page == _pagecontrol.numberOfPages -1){
        page = 0;
    }else{
        page++;
    }
    // 偏移量设置
    CGFloat offsetx = page * _scrollView.frame.size.width;
    [_scrollView setContentOffset:CGPointMake(offsetx, 0) animated:YES];
    
}

// 



@end


问题

  1. UIImageView设置了图片不显示问题:
    UIScrollView没有初始化。
    图片像素太大,截小一点就出来了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1789735.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

德人合科技——@天锐绿盾 | -文档透明加密系统

天锐绿盾文档透明加密系统是一种先进的数据安全解决方案&#xff0c;旨在保护企业和组织的敏感信息&#xff0c;防止未经授权的访问和泄漏。 PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是该系统的一些关键特点和功…

规则引擎-Easy rule

规则引擎-Easy rule 最近有几个项目中都出现了根据XX条件执行XX方法的业务&#xff0c;在动手之前脑中总会下意识的发现如果按照常规的去写代码&#xff0c;无论使用何种设计模式&#xff0c;都会出现不同程度上的代码冗余或大量if-else判断。 甚至说判断XX条件的代码和执行X…

26、matlab多项式曲线拟合:polyfit ()函数

1、polyfit 多项式曲线拟合 语法 语法&#xff1a;p polyfit(x,y,n) 返回次数为 n 的多项式 p(x) 的系数&#xff0c;该阶数是 y 中数据的最佳拟合&#xff08;基于最小二乘指标&#xff09;。 语法&#xff1a;[p,S] polyfit(x,y,n) 还返回一个结构体 S 语法&#xff1a;[…

学会这14大招,30天涨粉两三千没问题!沈阳新媒体运营培训

很多小白在刚转入公司做新媒体时&#xff0c;基本都是从帮助公司运营账号开始的。但不同于个人号&#xff0c;一个企业本身是没有ip属性的&#xff0c;它的风格、调性等&#xff0c;都需要通过你的运营&#xff0c;让它变成一个活灵活现的、赋予独立个性人设的账号。 目前&…

IC设计企业致力于解决的HPC数据防泄漏,到底该怎么做?

对于半导体IC设计企业来说&#xff0c;芯片设计、验证、仿真使用HPC环境现在已逐渐成为趋势&#xff0c;主要原因在于原来的工作流程存在较多的缺陷&#xff1a; 性能瓶颈&#xff1a;仿真、设计、验证、生产过程中&#xff0c;前端仿真需要小文件高并发低时延的读写和巨量元数…

Ubuntu server 24.04 (Linux) 搭建DNS服务器 通过Nginx实现UDP/TCP负载均衡 轻量级dnsmasq服务器

一 系统运行环境 testtest:~$ cat /etc/os-release PRETTY_NAME"Ubuntu 24.04 LTS" NAME"Ubuntu" VERSION_ID"24.04" VERSION"24.04 LTS (Noble Numbat)" VERSION_CODENAMEnoble IDubuntu ID_LIKEdebian HOME_URL"https://www.…

专业130+总分400+四川大学951信号与系统考研经验川大电子信息与通信工程,真题,大纲,参考书。教材。

今年四川大学951信号与系统专业课130&#xff08;据我所知没有140以上的今年&#xff09;&#xff0c;总分400&#xff0c;顺利上岸川大&#xff0c;回顾一下自己这一年的复习&#xff0c;希望自己的经历可以对大家复习有所借鉴&#xff0c;也是对自己的考研画上句话。专业课&a…

2024-06-05 Android app jni里面c语言函数申请的局部变量数组过大会导致程序崩溃的问题分析

一、下面是一个app jni里面一个函数&#xff0c;函数里面定义一个数组&#xff0c;实际运行的时候发现数组过大的时候会导致app崩溃。 JNIEXPORT jint JNICALL JNI_FUNCTION(native_1getcapture_1data)(JNIEnv *env, jobject obj,jbyteArray des_data,jbyteArray src_data,jin…

【Kubernetes】k8s的调度约束(亲和与反亲和)

一、调度约束 list-watch 组件 Kubernetes 是通过 List-Watch 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令&#xff0c;在 Node 节点上面建立 Pod 和…

【Qt】Frame和Widget的区别

1. 这两个伙计有啥区别&#xff1f; 2. 区别 2.1 Frame继承自Widget&#xff0c;多了一些专有的功能 Frame Widget 2.2 Frame可以设置边框

Socket编程学习笔记之TCP与UDP

Socket&#xff1a; Socket是什么呢&#xff1f; 是一套用于不同主机间通讯的API&#xff0c;是应用层与TCP/IP协议族通信的中间软件抽象层。 是一组接口。在设计模式中&#xff0c;Socket其实就是一个门面模式&#xff0c;它把复杂的TCP/IP协议族隐藏在Socket接口后面&#…

视频监控汇聚平台LntonCVS国标GB28181协议实现语音对讲功能

在当今这个智能技术飞速发展的时代&#xff0c;人工智能已经成为了电子产品领域的一股不可忽视的热门趋势。随着科技的不断进步&#xff0c;越来越多的电子产品开始融入人工智能技术&#xff0c;从而为其开拓了全新的发展路径。在这个大背景下&#xff0c;安防摄像头无插件直播…

硬件高效的线性注意力机制Gated Linear Attention论文阅读

0x0. 前言 上篇文章 flash-linear-attention中的Chunkwise并行算法的理解 根据GLA Transformer Paper&#xff08;https://arxiv.org/pdf/2312.06635 作者是这位大佬 sonta&#xff09;通过对Linear Attention的完全并行和RNN以及Chunkwise形式的介绍理解了Linear Attention的…

Isaac Lab支持的强化学习框架介绍

在Isaac Lab中使用rl_games强化学习框架进行机械臂训练实验 python source/standalone/workflows/rl_games/train.py --taskIsaac-Franka-Cabinet-Direct-v0 使用 RL 代理进行培训 — Isaac Lab 文档 --- Training with an RL Agent — Isaac Lab documentation (isaac-sim.g…

企业级win10电脑下同时存在Python3.11.7Python3.6.6,其中Python3.6.6是后装的【过程与踩坑复盘】

背景: 需要迁移原始服务器的上的Python3.6.6+Flask项目到一个新服务器上, 新服务器上本身存在一个Python3.11.7, 所以这涉及到了一个电脑需要装多个Python版本的问题 过程: 1-确定新电脑版本【比如是32还是64位】 前面开发人员存留了两个包,是python-3.6.6.exe和pytho…

Java Web学习笔记6——盒子模型

视频标签&#xff1a;<video> src: 规定视频的URL controls&#xff1a;显示播放控件 width&#xff1a;播放器的宽度 height&#xff1a;播放器的高度 音频标签&#xff1a;<audio> src: 规定音频的URL controls: 显示播放控件 段落标签&#xff1a;<p&g…

Kafka之Broker原理

1. 日志数据的存储 1.1 Partition 1. 为了实现横向扩展&#xff0c;把不同的数据存放在不同的 Broker 上&#xff0c;同时降低单台服务器的访问压力&#xff0c;我们把一个Topic 中的数据分隔成多个 Partition 2. 每个 Partition 中的消息是有序的&#xff0c;顺序写入&#x…

GNU Radio创建qt time plot python OOT块

文章目录 前言一、创建自定义的 OOT 块1、安装相应依赖2、创建 OOT 块3、修改相关4、编译及安装 OOT 块 二、测试1、grc 图2、运行结果 三、资源自取 前言 官方提供的绘制时域波形的 block 名字叫做 QT GUI Time Sink&#xff0c;其底层实现是用 C 写的&#xff0c;但是我发现…

webf 开发工具:数据库持久层基础文件生成工具

WZW.SqlMapHelpForJava是运行在.Net Framework4.0上的数据库持久层基础文件生成工具&#xff0c;支持多种关系型数据库的持久层基础文件、Java类的生成以及对配置文件的更新&#xff0c;与webf框架进行紧密配合&#xff0c;减少了数据库持久层基础文件编写工作量&#xff0c;提…

比瓴科技以何魅力吸引安全大牛?

今年4月&#xff0c;专注于软件供应链安全的行业领导厂商比瓴科技宣布&#xff0c;与元豚科技战略合并&#xff0c;元豚科技创始人唐誉聪加入比瓴&#xff0c;担任合伙人及研发副总裁一职。唐誉聪表示&#xff0c;将携手比瓴共同推动持续应用安全平台(ASPM)的发展&#xff0c;将…