精华内容
下载资源
问答
  • 做项目时需要用到OLED屏幕滚动显示的功能,复制其他博主的代码完成了水平滚动显示的功能。http://www.51hei.com/bbs/dpj-180145-1.html 但是,2.42寸OLED的滚动显示和0.96寸初始化设置还是有略微的区别的,如果直接...

    做项目时需要用到OLED屏幕滚动显示的功能,复制其他博主的代码完成了水平滚动显示的功能。http://www.51hei.com/bbs/dpj-180145-1.html

    但是,2.42寸OLED的滚动显示和0.96寸初始化设置还是有略微的区别的,如果直接复制粘贴,你会发现屏幕只有一小块地方在动。

    网上搜了很久,都是0.96寸的介绍应用,无奈之下自己查阅英文文档,最终解决。

    希望为要使用2.42寸屏幕的朋友提供些许帮助。

    贴上两者的初始化设置代码。

     

    0.96

     

    void OLED_Init(void)
    {
    
       GPIO_InitTypeDef  GPIO_InitStructure;
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);//使能PORTA~E,PORTG时钟
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13 ;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
        GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化
        OLED_RST_Set();
        delay_ms(100);
        OLED_RST_Clr();
        delay_ms(200);
        OLED_RST_Set();
        OLED_WR_Byte(0xAE,OLED_CMD); //关闭显示
        OLED_WR_Byte(0xD5,OLED_CMD); //设置时钟分频因子,震荡频率
        OLED_WR_Byte(0x80,OLED_CMD);   //[3:0],分频因子;[7:4],震荡频率	
        OLED_WR_Byte(0xA8,OLED_CMD); //设置驱动路数
        OLED_WR_Byte(0X3F,OLED_CMD); //默认0X3F(1/64) 
        OLED_WR_Byte(0xD3,OLED_CMD); //设置显示偏移
        OLED_WR_Byte(0X00,OLED_CMD); //默认为0
        
        OLED_WR_Byte(0x40,OLED_CMD); //设置显示开始行 [5:0],行数.
        //												    
        OLED_WR_Byte(0x8D,OLED_CMD); //电荷泵设置
        OLED_WR_Byte(0x14,OLED_CMD); //bit2,开启/关闭
        OLED_WR_Byte(0x20,OLED_CMD); //设置内存地址模式
        OLED_WR_Byte(0x02,OLED_CMD); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;
        //
        OLED_WR_Byte(0xA1,OLED_CMD); //段重定义设置,bit0:0,0->0;1,0->127;
        
        OLED_WR_Byte(0xc8,OLED_CMD); //(0xC0/0xC8) Set COM Output Scan Direction  行扫描顺序:从上到下
        
        //OLED_WR_Byte(0xC0,OLED_CMD); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数
        OLED_WR_Byte(0xDA,OLED_CMD); //设置COM硬件引脚配置
        OLED_WR_Byte(0x12,OLED_CMD); //[5:4]配置
        
        OLED_WR_Byte(0x81,OLED_CMD); //对比度设置
        OLED_WR_Byte(0xcf,OLED_CMD); //1~255;默认0X7F (亮度设置,越大越亮)
        
        OLED_WR_Byte(0xD9,OLED_CMD); //设置预充电周期
        OLED_WR_Byte(0xf1,OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2;
        OLED_WR_Byte(0xDB,OLED_CMD); //设置VCOMH 电压倍率
        OLED_WR_Byte(0x40,OLED_CMD); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;
        
        OLED_WR_Byte(0xA4,OLED_CMD); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)
        OLED_WR_Byte(0xA6,OLED_CMD); //设置显示方式;bit0:1,反相显示;0,正常显示	   
        
        OLED_WR_Byte(0x8d,OLED_CMD);
        OLED_WR_Byte(0x14,OLED_CMD);
        delay_ms(200);
        OLED_WR_Byte(0xAF,OLED_CMD); //开启显示	 
        delay_ms(200);
        OLED_Clear();
        OLED_Set_Pos(0, 0);
    
    		//以下为实现滚屏增加的初始化配置
    	OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动
      OLED_WR_Byte(0x26,OLED_CMD);        //水平向左或者右滚动 26/27
      OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
      OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0  (000-111)
      OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔
      OLED_WR_Byte(0x07,OLED_CMD);        //终止页 7
      OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
      OLED_WR_Byte(0xFF,OLED_CMD);        //虚拟字节	 
      OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动	
    }

     

    2.42

    前面部分的设置都是一样的。2.42寸屏幕的代码需要增加一行虚拟字节,修改一行虚拟字节,英文注释为官方文档复制

    		//以下为实现滚屏增加的初始化配置
    	OLED_WR_Byte(0x2E,OLED_CMD);        //关闭滚动
      OLED_WR_Byte(0x26,OLED_CMD);        //水平向左或者右滚动 26/27
      OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节
      OLED_WR_Byte(0x00,OLED_CMD);        //起始页 0  (000-111)
      OLED_WR_Byte(0x07,OLED_CMD);        //滚动时间间隔
      OLED_WR_Byte(0x07,OLED_CMD);        //终止页 7
      OLED_WR_Byte(0x00,OLED_CMD);        //虚拟字节  //E[7:0] : Dummy byte (Set as 00h)
    
    //不同之处 不同之处 不同之处 不同之处 
      OLED_WR_Byte(0x00,OLED_CMD);  //虚拟字节 //F[7:0] : Define the start column (RESET = 00h) 
      OLED_WR_Byte(0x7F,OLED_CMD);  //G[7:0] : Define the end column address (RESET = 7Fh) 
    
    //  OLED_WR_Byte(0x2F,OLED_CMD);        //开启滚动	

     

     

    展开全文
  • 飞机游戏:屏幕滚动,飞机拖拽,边界设置,子弹跟随

    昨天没有写博客,今天将内容一并补上。API以及C++类的运用有待进一步清晰。
    我是一个有阅读障碍的人,能够读的出来的东西我就很容易理解。但API的代码没法读。对于还不理解的东西,用的时候会不踏实。总感觉像借来的,随时会还回去。

    屏幕滚动:

    这一点跟之前做flabby bird游戏时,底板移动的逻辑是一样的,举例说明:
    首先要获取到场景的尺寸和坐标

    Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    假设场景的锚点在左下角(0,0),背景图片的锚点在正中间(0.5,0.5)。

    那么第一张图片的初始位置就是(场景宽度/2,场景高度/2)
    sprite1->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2)); 
    
    那么第二张图片的初始位置就是(场景宽度/2,图片1的高度+图片2高度/2)
    sprite2->setPosition(Vec2(visibleSize.width / 2, sprite1->getContentSize().height + sprite2->getContentSize().height/2));

    图片需要向下偏移,偏移的速度需要用到一个计时器,这里有一个API:

    /*添加背景计时器,计时器有一个回调方法,后面的数字代表频率,单位为秒,数字类型为float型*/
    schedule(CC_SCHEDULE_SELECTOR(GameScene::autoremove), 0.002f);   
    
    /*在计时器的回调方法中实现屏幕的滚动*/
    void GameScene::autoremove(float dt)
    {
        Size visibleSize = Director::getInstance()->getVisibleSize();
        auto b1 = this->getChildByTag(1);    //这是按标签获取子节点
        auto b2 = this->getChildByTag(2);
        b1->setPositionY(b1->getPositionY() -5);   //这是设置单位偏移量,每个计算单位沿Y轴向下偏移5个像素
        b2->setPositionY(b2->getPositionY() -5);
    
        /*滚动算法:当图片上沿移动至场景下沿是将其置于第二张图片的初始位置,依次循环*/
        if (b1->getPositionY() + b1->getContentSize().height / 2 <= 0)
        {
            b1->setPosition(Vec2(visibleSize.width / 2, b2->getContentSize().height / 2 +   visibleSize.height)); 
        }
        if (b2->getPositionY() + b2->getContentSize().height / 2 <= 0)
        {
            b2->setPosition(Vec2(visibleSize.width / 2, b2->getContentSize().height / 2 + visibleSize.height));
        }
    }

    飞机拖拽:

    1,采用单例模式创建飞机对象。在飞机类中声明一个静态的成员变量(静态的飞机类指针),还有一个静态的成员函数用于返回该即将创建的飞机对象。该模式下只会创建唯一的飞机对象,而且可以当做全局变量使用,确保在任意文件中都可以被获取到。

    2,因为飞机所在的图层大小和它的父图层(Gamescene)图层的大小是一样的,而在点击飞机的时候会有一个穿透效应,就是说点击的其实是飞机所在的图层,而图层的大小又是和场景大小一样且完全重叠的,所以该情况下是无法完成拖拽的。解决方案有两种:
    ->1,设法直接获取到飞机精灵在图层上的节点位置。(当前使用的就是该方法)
    ->2,将飞机图层的尺寸设置成和飞机的尺寸大小一样,继而达到移动飞机所在图层便能移动飞机的效果。
    3,所以在飞机的类中还要声明一个节点类型的成员变量,和一个用于返回该节点的成员函数。
    4,飞机所有的动作都需要有一个函数来实现,所以还需要再定义一个成员函数。

    代码如下:
    class Planee : public cocos2d::Layer
    {
    public: 
        static Planee* getInter();
        Node* getPlaneSp();
        void showInit();
    private:
        static Planee *pl;   //一定要是静态的指针变量
        Node *sprite1;      //后面创建飞机精灵时就必须用sprite1这个变量名,否则就没有意义了
    };
    

    单例模式创建飞机对象的逻辑:首先检查有没有,如果没有就创建,有就直接返回

    代码如下:
    Planee *Planee::pl = NULL;   //永远记得指针的初始化,用NULL把它栓起来
    Planee* Planee::getInter()
    {
        if (NULL == pl)
        {
            pl = new Planee();
        }
        return pl;
    }

    经过了以上这一步之后,不管之前有没有创建过pl这个飞机对象,现在它都已经存在了,那么接下来就是返回飞机的节点,为后面做准备:

    Node* Planee::getPlaneSp()
    {
        return sprite1;
    }

    接下来就是实现飞机精灵的各种功能,首先在加载精灵的时候,精灵的变量名就直接用Sprite1,我们将它设计成一个可以全局通用的变量就是要在这里用的。所以此处的变量名前不能再加auto,不然会报错,会报错。

    sprite1 = Sprite::create("player1.png");

    精灵加载好,接下来就是给它添加点击事件。点击事件有按下,移动,抬起,撤销,但这里需要用到的只有按下,移动,抬起,这一段主要是API的使用:

        /*添加点击事件*/
        auto listener1 = EventListenerTouchOneByOne::create();
        listener1->setSwallowTouches(true);
    
        /*鼠标按下*/
        listener1->onTouchBegan = [](Touch* touch, Event* event)
        {
            auto target = static_cast<Sprite*>(event->getCurrentTarget());  //关键代码:获取当前对象
            Vec2 locationInNode = target->convertToNodeSpace(touch->getLocation());
            Size s = target->getContentSize();   //获取当前对象的尺寸
            Rect rect = Rect(0, 0, s.width, s.height);   //设定点击响应范围
            if (rect.containsPoint(locationInNode))    //判断点击是否有效
            {
                log("sprite began... x = %f, y = %f", locationInNode.x, locationInNode.y); //打印坐标
                target->setOpacity(180);
                return true;
            }
            return false;
        };
    
        /*鼠标移动*/
        listener1->onTouchMoved = [](Touch* touch, Event* event)  
        {
            Size visibleSize = Director::getInstance()->getVisibleSize();  //场景尺寸
            auto target = static_cast<Sprite*>(event->getCurrentTarget());
            target->setPosition(target->getPosition() + touch->getDelta());
    
        /*鼠标抬起*/
        listener1->onTouchEnded = [=](Touch* touch, Event* event)
        {
            auto target = static_cast<Sprite*>(event->getCurrentTarget());
            log("sprite onTouchesEnded.. ");    
        };

    到这里,飞机已经可以跟随鼠标移动。接下来就是设置边界,这个很好理解,飞机的锚点在正中心,保证其不出界只需要让锚点距离场景边界的距离始终>=飞机对应轴向尺寸的一半就可以。

    X轴右边界为例,设置如下
            if (target->getPositionX() + touch->getDelta().x >= visibleSize.width - target->getContentSize().width/2)
            {
                target->setPositionX(visibleSize.width - target->getContentSize().width / 2);

    经过一番折腾,边界问题也解决了,最难的部分到了,怎样才能让子弹跟着飞机跑呢?

    逻辑:
    在加载子弹精灵时,将其初始化的坐标等于飞机坐标,这样就可以实现子弹与飞机的跟随效果。要实现这个效果,首先就得让子弹能够获取到飞机精灵在图层上的节点坐标。这就是为什么我们要在前面的飞机类中设计一个返回值为节点类型的成员函数的原因。那么最让我觉得绕的地方就在于,如何才能把飞机对象传给子弹,思路如下:

    1,在子弹类的头文件中引用飞机类的.h文件

    2,在子弹类中定义一个构造函数,参数为飞机类的一个指针

    /*子弹类的结构*/
    class Bullet : public cocos2d::Layer
    {
    public: 
        Bullet(Planee*);   //构造函数,参数为一个飞机类的指针
        void show();
        void move(float dt);
    private:
        Planee *planee;
    };

    3,在GameScene中动态创建子弹对象时,传入飞机对象

    /*动态创建子弹*/
    Bullet *p2 = new Bullet(planee);   //将单例模式下创建的planee对象作为参数传入构造函数
    this->addChild(p2, 1, 4);
    return tru

    4,用子弹类的私有成员变量来接传入的飞机对象,此时子弹类的各成员函数中就可以获取到飞机的对象,再通过飞机对象的成员函数就可以获取到飞机的节点位置。也就是说从头到尾都只有一个飞机对象,只是中间辗转反侧换过几个别名而已。

    /*子弹类的构造函数*/
    Bullet::Bullet(Planee *p)  //此句有疑问
    {
        this->planee = p;
        show();
    }

    5,获取以后就可以将飞机的节点位置作为子弹的发射位置,子弹移动的目的坐标的X坐标也要做相应的修改

    /*添加子弹*/
    auto sprite3 = Sprite::create("bullet_1.png");
    sprite3->setPosition(Vec2(this->planee->getPlaneSp()->getPositionX(), 
                            this->planee->getPlaneSp()->getPositionY())); //设置坐标
    /*
    this->planee->getPlaneSp()->getPositionX()  //这一步是关键,好好理解
    */
    展开全文
  • //监听屏幕滚动 判断上下滚动 (组件悬浮窗使用) onPageScroll: function (ev) { var _this = this; //当滚动的top值最大或者最小时,为什么要做这一步是由于在手机实测小程序的时候会发生滚动条回弹,所以为了...

    1.单独写

    page({
    	data:{
    		scrollTop:0
    	},
       //监听屏幕滚动 判断上下滚动 
       onPageScroll: function (ev) {
        var _this = this;
        //当滚动的top值最大或者最小时,为什么要做这一步是由于在手机实测小程序的时候会发生滚动条回弹。防止发生回弹,设置默认最大最小值   
        if (ev.scrollTop <= 0) {
          ev.scrollTop = 0;
        } else if (ev.scrollTop > wx.getSystemInfoSync().windowHeight) {
          ev.scrollTop = wx.getSystemInfoSync().windowHeight;
        }
        //判断浏览器滚动条上下滚动   
        if (ev.scrollTop > this.data.scrollTop || ev.scrollTop == wx.getSystemInfoSync().windowHeight) {
            this.setData({
              istrue_scroll:true  //控制页面显示
            })   
        } else {
          this.setData({
            istrue_scroll:false   //控制页面隐藏
          }) 
          console.log('向上滚动');  
        }  
        //给scrollTop重新赋值    
        setTimeout(function () {
          _this.setData({
            scrollTop: ev.scrollTop
          })
        }, 0)
      },
    })
    

    2.写在util里成公共的类

    var util = require('../../../utils/util.js');
    page({
    	data:{
    		scrollTop:0
    	},
    	//监听屏幕滚动 判断上下滚动
       	onPageScroll: function (ev) {
        	var that=this;
        	var data_scrollTop=this.data.scrollTop;
        	util.scrollFloatwindow(ev,data_scrollTop,that);
      	},
      ))
    

    util里

    module.exports = {
    	scrollFloatwindow:scrollFloatwindow
    }
    //滚动方向判断方法
    function scrollFloatwindow(ev,data_scrollTop,that){
        if (ev.scrollTop <= 0) {
          ev.scrollTop = 0;
        } else if (ev.scrollTop > wx.getSystemInfoSync().windowHeight) {
          ev.scrollTop = wx.getSystemInfoSync().windowHeight;
        }
        if (ev.scrollTop > data_scrollTop || ev.scrollTop == wx.getSystemInfoSync().windowHeight) {
          that.setData({
              istrue_scroll:true
            })   
        } else {
          that.setData({
            istrue_scroll:false
          }) 
          console.log('向上滚动');  
        }     
        setTimeout(function () {
          that.setData({
            scrollTop: ev.scrollTop
          })
        }, 0)
    }
    
    展开全文
  • js实现屏幕滚动

    千次阅读 2019-11-05 22:48:54
    再它里面有三个全屏的子标签,通过鼠标中键的滚动监听事件,设置三个标签top值.来设置显示哪个模块.再设置延时操作,防止多次滚动 <!DOCTYPE html> <html lang="en"> <head> <...

    全屏滚动的原理是什么?,用到了css的哪些属性.

    使用position设置成relative,基于浏览器窗口定位.浏览器显示的只有这个模块.再它里面有三个全屏的子标签,通过鼠标中键的滚动监听事件,设置三个标签top值.来设置显示哪个模块.再设置延时操作,防止多次滚动

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
        <style>
            html,body{
                margin:0;
                padding:0;
                overflow: hidden;
            }
           #pageContainer{
                position:relative;
                top:0;
                transition: all 1000ms ease;
                touch-action:none;
            }
            .pageItem{
                display: flex;
                justify-content: center;
                align-items: center;
                width: 100%;
                height: 100%;
                border: 1px solid #ddd;
            }
        </style>
        
    </head>
    <body>
        <div id="pageContainer">
            <div class="pageItem">1</div>
            <div class="pageItem">2</div>
            <div class="pageItem">3</div>
        </div>
    </body>
    <script>
            //获取整个对象
            var container = document.getElementById("pageContainer");
            //获取元素的高度,页面可视高度
            var viewHeight = document.documentElement.clientHeight;
            console.log(container)
            //获取滚动的页数
            console.log(document.getElementsByClassName("pageItem"))
            var pageNum = document.getElementsByClassName("pageItem").length;
            //初始化当前位置
            var currentPosition = 0;
            //设置页面高度
            container.style.height = viewHeight + 'px';
            // container.style.height = "height:"+viewHeight+'px'
            
            // 向上向下的操作
            function goDown(){
                if (currentPosition > -viewHeight * (pageNum - 1)) {
                    currentPosition = currentPosition - viewHeight;
                    container.style.top = currentPosition + 'px';
                    console.log(1234);
                }
            }
        
            function goUp(){
                if (currentPosition < 0){
                    currentPosition = currentPosition + viewHeight;
                    container.style.top = currentPosition + "px"
                }
            }
    
            //防止用户多次滚动的延时,使用到了闭包
            function throttle(fn,delay){
                let baseTime = 0;
                return function(){
                    const currentTime= Date.now()
                    if (baseTime + delay < currentTime){
                        fn.apply(this,arguments)
                        baseTime = currentTime
                    }
                }
            }
            // 绑定事件  fireFox 的滑动事件不同,做出区别
            var handlerWheel = throttle(scrollMove,1000)
            if(navigator.userAgent.toLowerCase().indexOf('fireFox') === -1){
                document.addEventListener("mousewheel",handlerWheel)
            }else{
                document.addEventListener("DOMMouseScroll",hanlerWheel)
            }
            function scrollMove(e){
                if(e.deltaY > 0){
                    console.log(e.deltaY)
                    goDown()
                }else{
                    goUp()
                }
            }
            </script>
    </html>
    
    展开全文
  • //还原body滚动设置 var bodyScrollTop = 0 $(document.body).css({ "position":"static", "top":"-" + bodyScrollTop + "px" }); // 处理滚动穿透 //设置body固定内容不可滚动,避免...
  • 一、监听屏幕滚动 判断上下滚动 onPageScroll: function (ev) { console.log(ev) let _this = this //当滚动的top值最大或者最小时,为什么要做这一步是由于在手机实测小程序的时候会发生滚动条回弹,所以为了...
  • IOS实现屏幕滚动

    2015-05-28 09:13:21
    1.创建一个UIScrollView对象,setFrame,加入主视图; 2.将各种需要滚动的子视图加入滚动试图...3.实现滚动的关键:setContentSize,设置滚动视图实例的size,当size的高或宽小于frame的对应值时才能实现滚动
  • 动态设置滚动条适应屏幕分辨率

    千次阅读 2012-06-20 13:53:22
    动态设置滚动条适应屏幕分辨率 需求描述: 报表在WEB页面输出的时候,行、列都很多,需要设置横向、纵向滚动条来固定报表表头。 处理方式: 在tag标签中设置scrollWidth于scrollHeight值来处理。 “ … ...
  • 弹窗屏幕居中: 半透明黑背景: .black-wrap{ position: absolute; width: 100%; height: 100%; left: 0; top: 0; background: rgba(0, 0, 0, .5); z-index: 999; } 弹框内容: .content{ posit...
  • 问题描述: 由于有的table中的列比较多,那么...如下图,我们需要的是要让滚动条一直显示在屏幕的最下边,无论你的table多高。 我们可以使用div 的横向滚动条。要想滚动条出现在屏幕底布的话,肯定需要div里面包...
  • 好多网站顶部有Menu,点击屏幕会滚动到相应的模块位置,方便高效,提供两种屏幕滚动。 1、最简单的设置锚点实现跳转 <a href="#abc">跳</a><!-- 跳转 --> <div >.........</div>...
  • 代码实现屏幕滚动

    2016-09-06 18:38:17
    首先在场景类里获取到两个连续滚动起来无痕迹的图片,放在resource文件夹下,然后代码获取到文件: Size visibleSize = Director::getInstance()->getVisibleSize(); //设置主场景的规格大小 Vec2 origin = ...
  • 问题描述:屏幕滚动时(包括网页滚动、word文档内滚动等)出现文字短暂变蓝,变蓝的情况只在滚动瞬时出现,滚动停止后颜色恢复正常。 解决方案:打开NVIDIA设置-显示-调整桌面颜色设置-2. 选择颜色设置方式-换为 ...
  • 这次做项目时需要实现OLED屏幕上字符滚动的功能,从网上找到一个参考:https://blog.csdn.net/tbmmagic/article/details/111999673int main(void){delay_init(); //延时函数初始化NVIC_Configuration(); //设置NVIC...
  • 它们都是在内容超出屏幕时,可以提供水平或垂直滚动条。 2.主要的3个属性,contentSize、contentInset和contentOffset。 2.1 首先,一定要设置contentSize(控件里实际内容占用的尺寸)这个属性,并且这...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,160
精华内容 864
关键字:

屏幕滚动设置