0.01秒计时不准确 ios_ios.倒计时 - CSDN
  • IOS之秒表计时

    2015-08-29 16:46:12
    1.利用xib方式新建一个秒表计数器。 功能实现: 该应用有三个按钮:开始,记次,复位 开始:开始控制着秒表的开始,点击后,按钮文字变成停止,在没有开始的情况下...复位:复位可以让秒表归零 ...实现效果图如下:

    1.利用xib方式新建一个秒表计数器。


    功能实现:

    该应用有三个按钮:开始,记次,复位

    开始:开始控制着秒表的开始,点击后,按钮文字变成停止,在没有开始的情况下不允许记次操作

    记次:可以记录多个你点击的时间,

    复位:复位可以让秒表归零


    实现效果图如下:

                                                     




    1.

    新建一个类,勾选xib,然后新建一个试图监控器,然后加载到根视图中

    AppDelegate.m中代码如下:

    //新建一个视图控制器
        MainViewController *myView = [[MainViewController alloc]init];
        //将新建的视图控制器放到根视图中去。
        self.window.rootViewController = myView;

    .

    我们在xib文件进行拖控件,两个label 和三个button,第一个label是一个不用操控的,只是一个

    题目而已

    第二个label是一个现实秒表数据的label

    然后是三个按钮,分别用来控制开始,记次,和复位:

    视图如下:

                   

      

    .

    MainViewController.h中声明成员变量:毫秒,秒,分钟:另外还有一个NSTimer类型的timer;来用来接收计时器的方法

     以每隔一毫秒调用让成员变成产生变化:

     因为我们要和按钮进行交互,所以当我按下按钮的时候,按钮的文本变成了停止,这时候就需要一个临时变量。然后

     用判断的方法,来对按钮进行更换文本,一般我们定义一个BOOL类型的变量。


     然后就是三个按钮控制的方法:

     代码如下:

    #import <UIKit/UIKit.h>
    
    	@interface MainViewController : UIViewController{
    	    
    	    
    	    int persent;
    	    int seconds;
    	    int minutes;
    	    IBOutlet UILabel *label;
    	    BOOL isOn;
    	    
    	    
    	}
    	@property (nonatomic,strong )NSTimer *timer;
    	- (IBAction)start:(id)sender;
    	- (IBAction)record;
    	- (IBAction)reset;
    
    	@end

    .

    首先我们开始实现方法:

    对数据成员进行初始化:然后新建一个计时器,控制时间的不断变化:

    代码如下:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        
        isStop = YES;
        //类方法会自动释放。
        self.timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(startTimer) userInfo:nil repeats:YES];
        //需要让定时器暂停
        [_timer setFireDate:[NSDate distantFuture]];
        
        // Do any additional setup after loading the view from its nib.
    }

    .

    在计数器里面我们看到一个方法:“startTimer”,没过1毫秒就调用这个方法,然后在这个方法中我们可以对成员变量

    进行操作:代码如下:

    -(void)startTimer{
        percens++;
        //没过100毫秒,就让秒+1,然后让毫秒在归零
        if(percens==100){
            seconds++;
            percens = 0;
        }
        if (seconds == 60) {
            minus++;
            seconds = 0;
        }
        //让不断变量的时间数据进行显示到label上面。
        label.text = [NSString stringWithFormat:@"%02d:%02d.%02d",minus,seconds,percens];
    }

    .

    然后考虑到的就是我们怎么控制的问题了,思路:我们只需把 [_timer setFireDate:[NSDate distantFuture]];

    方法中的NSDate修改为当前的时间就可以让计时器立即执行:然后我们在开始按钮关联的方法中进行操作

    代码如下:

    //sender是触发者,响应者是当前类的对象
    //目标动作机制。
    //启动
    -(IBAction)start:(id)sender{
    
        UIButton *btn = (UIButton *)sender;
         //如果按钮此时的状态是yes,那么我们按下后就把文本变成“停止”,然后让isStop = NO;
        //最主要的是让[_timer setFireDate:[NSDate date]];让计时器开始运行
        if (isStop) {
            [btn setTitle:@"停止" forState:UIControlStateNormal];
            [_timer setFireDate:[NSDate date]];
            isStop = NO;
        }else{//如果isStop = NO,当按钮按下的时候就让按钮的文本变成“开始”,然后在把isStop = YES;
             //然后让[_timer setFireDate:[NSDate distantFuture]];,让计时器停止运行
            [btn setTitle:@"开始" forState:UIControlStateNormal];
            [_timer setFireDate:[NSDate distantFuture]];
            isStop = YES;
        }
        //设置定时器的启动时间为当前时间。
        //[_timer setFireDate:[NSDate date]];
    }

    .

    然后我们开始写记录时间的方法,这个方法中需要我们定义两个UILabel,分别用来显示第一次按下的数据和

    按下的时候时间的数据。代码如下:

    //记次
    -(IBAction)record{
        //如果秒表没有启动,则无法点击
        if(isStop)return;
        static int count=0;
        
        UILabel *countLabel = [[UILabel alloc]init];
         //用来显示次数。Y轴不断的向下延伸,260是上一个控件占用的长度
        countLabel.frame = CGRectMake(10, count*30+260, 100, 30);
        countLabel.text = [NSString stringWithFormat:@"记次 %d",++count];
        //NSLog(@"%@",countLabel);
        [self.view addSubview:countLabel];
        
        //记时label
        UILabel *timeLabel = [[UILabel alloc]init];
        //count之所以减去1,因为++count,而次数和时间的数据要显示在同一行
        timeLabel.frame = CGRectMake(220, 260+(count-1)*30, 100, 30);
        timeLabel.text = label.text;
        [self.view addSubview:timeLabel];
    }


    8.

    最后就是我们的复位的方法了这个方法比较简单,只需要把成员变量置0,然后赋值就可以了

    代码如下

    //复位
    -(IBAction)reset{
        percens = 0;
        seconds = 0;
        minus = 0;
       label.text = [NSString stringWithFormat:@"%02d:%02d.%02d",percens,seconds,minus];
        
        
    }

    9.

    缺憾:

    1.记次次数过多的时候,的文本显示没有滚动条,所以一个屏幕只能显示数个记录的时间数据

    2.在复位的时候,如果开始按钮处于停止的文本,没有实现控制开始按钮让其变为初始值开始



    10.手写代码实现:

    由于源代码和上面的步骤差不多,这里就不做过多的介绍,仅提供源代码:

    点击打开链接

    介绍结束:




    展开全文
  • 自己在学习过程中用到过NSTimer,...我就直接在下面粘贴代码,希望能帮到一些初学iOS的朋友。 ViewController.h: #import @interface ViewController : UIViewController{  UIButton *startButton;  

    自己在学习过程中用到过NSTimer,当时在网上找了不少资料。现在自己做一个简单的demo跟大家分享。

    我就直接在下面粘贴代码,希望能帮到一些初学iOS的朋友。

    ViewController.h:

    #import <UIKit/UIKit.h>


    @interface ViewController : UIViewController{

        UIButton *startButton;

        UIButton *stopButton;

        UILabel *timeLabel;

        UILabel *detailLabel;

        NSTimer *mytimer;

    }


    @property (nonatomic) BOOL isOn;

    @property (nonatomic) int myTimerecord,hour,min,scd,mscd;

    @property (nonatomic) NSString *hourText,*minText,*scdText,*mscdText,*timeLabelText;



    @end


    ViewController.m:

    #import "ViewController.h"


    @interface ViewController ()


    @end


    @implementation ViewController

    _hour = 0;

    _min = 0;

    _scd = 0;

    _mscd = 0;

    _myTimerecord = 0;


    - (void)viewDidLoad {

        [super viewDidLoad];

        

        detailLabel = [[UILabel alloc]initWithFrame:CGRectMake(60, 30, 200, 70)];

        detailLabel.text = @"计时器";

        [detailLabel setTextAlignment:NSTextAlignmentCenter];

        [self.view addSubview:detailLabel];

        

        startButton = [[UIButton alloc]initWithFrame:CGRectMake(60, 320, 60, 40)];

        [startButton setBackgroundColor:[UIColor blueColor]];

        [startButton setTitle:@"开始" forState:UIControlStateNormal];

        [startButton addTarget:self action:@selector(startBtAction) forControlEvents:UIControlEventTouchUpInside];

        [self.view addSubview:startButton];

        

        stopButton = [[UIButton alloc]initWithFrame:CGRectMake(200, 320, 60, 40)];

        [stopButton setBackgroundColor:[UIColor blackColor]];

        [stopButton setTitle:@"停止" forState:UIControlStateNormal];

        [stopButton addTarget:self action:@selector(stopBtAction) forControlEvents:UIControlEventTouchUpInside];

        [self.view addSubview:stopButton];

        

        timeLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 100, 320, 120)];

        [timeLabel setTextAlignment:NSTextAlignmentCenter];

        [timeLabel setText:@"00  :  00  :  00  :  00"];

        timeLabel.font = [UIFont boldSystemFontOfSize:32.0];

        [timeLabel setBackgroundColor:[UIColor blackColor]];

        [timeLabel setTextColor:[UIColor whiteColor]];

        [self.view addSubview:timeLabel];

        

        //这里0.01表示设置时间间隔是0.01

        mytimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(timerFired) userInfo:nil repeats:YES];

        // Do any additional setup after loading the view.

    }


    //根据上面的设定,这个方法每隔0.01秒执行一次

    -(void)timerFired

    {

        if (_isOn) {

            _myTimerecord++;                      //记录累计微妙的值,根据这个值计算出相对应的秒,分钟,小时

            _hour = _myTimerecord / 360000;

            _min = (_myTimerecord%360000)/6000;

            _scd = (_myTimerecord%6000)/100;

            _mscd = _myTimerecord%100;

        }

        [self updateUI];

    }


    -(void)startBtAction

    {

        if (_isOn) {

            _isOn = NO;

        } else {

            _isOn = YES;

        }

    }


    -(void)stopBtAction

    {

        _isOn = NO;//暂停

        [self realStop];

    }


    -(void)realStop

    {

        _hour = 0;

        _min = 0;

        _scd = 0;

        _mscd = 0;

        _myTimerecord = 0;

        _isOn = NO;

    }


    //这个方法实现数据(_myTimerecord)和页面中显示的值是统一的

    -(void)updateUI

    {

        if (_hour < 10) {

            _hourText = [[NSString alloc]initWithFormat:@"0%d",_hour];

        }else {

            _hourText = [[NSString alloc]initWithFormat:@"%d",_hour];

        }

        

        if (_min < 10) {

            _minText = [[NSString alloc]initWithFormat:@"0%d",_min];

        }else {

            _minText = [[NSString alloc]initWithFormat:@"%d",_min];

        }

        

        if (_scd < 10) {

            _scdText = [[NSString alloc]initWithFormat:@"0%d",_scd];

        }else {

            _scdText = [[NSString alloc]initWithFormat:@"%d",_scd];

        }

        

        if (_mscd < 10) {

            _mscdText = [[NSString alloc]initWithFormat:@"0%d",_mscd];

        } else {

            _mscdText = [[NSString alloc]initWithFormat:@"%d",_mscd];

        }

        

        _timeLabelText = [[NSString alloc]initWithFormat:@"%@  :  %@  :  %@  :  %@",_hourText,_minText,_scdText,_mscdText];

        [timeLabel setText:_timeLabelText];

        

        if (_isOn) {

            [startButton setTitle:@"暂停" forState:UIControlStateNormal];

        }else {

            [startButton setTitle:@"开始" forState:UIControlStateNormal];

        }

    }


    @end



    展开全文
  • XMTimer教程:XMTimer 先导入XMTimer.h 自定义一个继承自XMTimer的类 #import "XMTimer.h" @interface XMSyncTimer : XMTimer @end 实现它的方法 #import "XMSyncTimer.h" ...+ (void)startTimerTask:(N...

    XMTimer教程:XMTimer

    先导入XMTimer.h

    自定义一个继承自XMTimer的类
    
    #import "XMTimer.h"
    
    @interface XMSyncTimer : XMTimer
    
    @end
    
    
    
    实现它的方法
    #import "XMSyncTimer.h"
    
    @implementation XMSyncTimer
    
    
    + (void)startTimerTask:(NSTimeInterval)startTime interval:(NSTimeInterval)interval taskBlock:(taskBlock)block{
      //创建线程
        NSThread *thread = [[NSThread alloc] initWithBlock:^{
            //执行XMTimer的方法
            [super startTimerTask:startTime interval:interval taskBlock:block];
            
        }];
        
        [thread start];
    }
    
    + (void)startTimerTask:(NSTimeInterval)startTime durationTime:(NSTimeInterval)durationTime taskBlock:(taskBlock)block{
        //创建线程
        NSThread *thread = [[NSThread alloc] initWithBlock:^{
            //执行XMTimer的方法
            [super startTimerTask:startTime durationTime:durationTime taskBlock:block];
            
        }];
        
        [thread start];
    }
    
    + (void)startTimerTask:(NSTimeInterval)startTime interval:(NSTimeInterval)interval durationTime:(NSTimeInterval)durationTime taskBlock:(taskBlock)block taskEndBlock:(taskBlock)taskEndBlock{
        
        //创建线程
        NSThread *thread = [[NSThread alloc] initWithBlock:^{
            //执行XMTimer的方法,结束计时器代码块这里要注意,这里需要再写一个代码块,把参数代码块放进这个代码块里,再加一句结束线程就可以了
            [super startTimerTask:startTime interval:interval durationTime:durationTime taskBlock:block taskEndBlock:^{
                taskEndBlock();
                [thread cancel];
            }];
            
        }];
        
        [thread start];
        
    }
    
    
    
    
    思路是把XMTimer的计时器放进一个线程里,他就不会阻塞程序的运行了。

    测试

    	UIView *sview = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 375, 100)];
    	    [sview setBackgroundColor:[UIColor grayColor]];
    	    [self.view addSubview:sview];
    	    [XMSyncTimer startTimerTask:1 interval:0.01 durationTime:5 taskBlock:^{
    	        dispatch_async(dispatch_get_main_queue(), ^{
    	            [sview setFrame:CGRectMake(sview.frame.origin.x , sview.frame.origin.y + 1, 	sview.frame.size.width, sview.frame.size.height)];
    	            [sview setAlpha:sview.alpha-0.002];
    	        });
    	
    	    } taskEndBlock:^{
    	        NSLog(@"关闭");
    	    }];
    
    
    
    展开全文
  • 1 + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo ...当每0.01秒进行一次repeat操作时,NSTimer是不准的,严重滞后,而改成0.1
    1 + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

    当每0.01秒进行一次repeat操作时,NSTimer是不准的,严重滞后,而改成0.1秒repeat操作,则这种滞后要好一些。

    导致误差的原因是我在使用“scheduledTimerWithTimeInterval”方法时,NSTimer实例是被加到当前runloop中的,模式是NSDefaultRunLoopMode。而“当前runloop”就是应用程序的main runloop,此main runloop负责了所有的主线程事件,这其中包括了UI界面的各种事件。当主线程中进行复杂的运算,或者进行UI界面操作时,由于在main runloop中NSTimer是同步交付的被“阻塞”,而模式也有可能会改变。因此,就会导致NSTimer计时出现延误。

    解决这种误差的方法,一种是在子线程中进行NSTimer的操作,再在主线程中修改UI界面显示操作结果;另一种是仍然在主线程中进行NSTimer操作,但是将NSTimer实例加到main runloop的特定mode(模式)中。避免被复杂运算操作或者UI界面刷新所干扰。

    方法一:

    在开始计时的地方:

    1 if (self.timer) {
    2         [self.timer invalidate];
    3         self.timer = nil;
    4     }
    5     self.timer = [NSTimer timerWithTimeInterval:0.01 target:self selector:@selector(addTime) userInfo:nil repeats:YES];
    6     [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];

    [NSRunLoop currentRunLoop]获取的就是“main runloop”,使用NSRunLoopCommonModes模式,将NSTimer加入其中。

     

    方法二:

    开辟子线程:(使用子线程的runloop)

    1 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(newThread) object:nil];
    2     [thread start];
    1 - (void)newThread
    2 {
    3     @autoreleasepool
    4     {
    5         [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(addTime) userInfo:nil repeats:YES];
    6         [[NSRunLoop currentRunLoop] run];
    7     }
    8 }

    在子线程中将NSTimer以默认方式加到该线程的runloop中,启动子线程。

     

    方法三:

    使用GCD,同样也是多线程方式:

    声明全局成员变量

    1 dispatch_source_t _timers;
     1     uint64_t interval = 0.01 * NSEC_PER_SEC;
     2     dispatch_queue_t queue = dispatch_queue_create("my queue", 0);
     3     _timers = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
     4     dispatch_source_set_timer(_timers, dispatch_time(DISPATCH_TIME_NOW, 0), interval, 0);
     5     __weak ViewController *blockSelf = self;
     6     dispatch_source_set_event_handler(_timers, ^()
     7     {
     8         NSLog(@"Timer %@", [NSThread currentThread]);
     9         [blockSelf addTime];
    10     });
    11     dispatch_resume(_timers);

    然后在主线程中修改UI界面:

    1 dispatch_async(dispatch_get_main_queue(), ^{
    2         self.label.text = [NSString stringWithFormat:@"%.2f", self.timeCount/100];
    3     });


    方法四:

         
     //用NSObject的方法创建一个多线程
     [self performSelectorInBackground:@selector(multiThread) withObject:nil];
         
    - (void)multiThread
    {
        if (![NSThread isMainThread]) {
             
            // 第1种方式
            //此种方式创建的timer已经添加至runloop中
    //        [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
            //保持线程为活动状态,才能保证定时器执行
    //        [[NSRunLoop currentRunLoop] run];//已经将nstimer添加到NSRunloop中了
             
            //第2种方式
            //此种方式创建的timer没有添加至runloop中
           NSTimer *timer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
            //将定时器添加到runloop中
            [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
            [[NSRunLoop currentRunLoop] run];
            NSLog(@"多线程结束");
        }
    }
     
    - (void)timerAction
    {
        //定时器也是在子线程中执行的
        if (![NSThread isMainThread]) {
            NSLog(@"定时器");
        }
    }

    总结:

    runloop是一个看似很神秘的东西,其实一点也不神秘。每个线程都有一个实际已经存在的runloop。比如我们的主线程,在主函数的UIApplication中:

    1 UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]))

    系统就为我们将主线程的main runloop隐式的启动了。runloop顾名思义就是一个“循环”,他不停地运行,从程序开始到程序退出。正是由于这个“循环”在不断地监听各种事件,程序才有能力检测到用户的各种触摸交互、网络返回的数据才会被检测到、定时器才会在预定的时间触发操作……

    runloop只接受两种任务:输入源和定时源。本文中说的就是定时源。默认状态下,子线程的runloop中没有加入我们自己的源,那么我们在子线程中使用自己的定时器时,就需要自己加到runloop中,并启动该子线程的runloop,这样才能正确的运行定时器。

    展开全文
  • UITableView 中倒计时

    2015-07-02 15:42:33
    变量 int keepTime; NSTimer *timer;timer 事件中keepTime ++; 思路:在cell中单独写一个更新...1.以为单位倒计时 将timer的TimeInterval设定为1, 这种只需要tableview reloadData 就可以了。经过测试,4s设备

    变量
    int keepTime;
    NSTimer *timer;

    timer 事件中keepTime ++;
    思路:在cell中单独写一个更新时间显示的方法,每次调用该方法时,只需要把已知时间 - keepTime,再进行计算就可以了。
    1.以秒为单位倒计时
    将timer的TimeInterval设定为1,
    这种只需要tableview reloadData 就可以了。经过测试,4s设备上就会出现都是比较流畅的,但是这里没有去测电量问题。
    2.以分秒为单位倒计时
    将timer的TimeInterval设定为0.01,
    这样再直接reloadData或者只reload visiableCells 一样的会卡。而且在UI上会很明显的出现UI的抖动。
    解决方法:
    只更新cell的 方法。

    例: 展示 00:00:00 分:秒:分秒
    cell 中的方法

    - (void)updateTime:(int)time
    {
        if (time <=0) {
            self.countDownTimeLabel.text = @"等待开奖中...";
            return;
        }
        int minute = 0; // 分
        int second = 0; // 秒
        int last = 0; // 分秒
    
        last = time % 100; //
        second = (time / 100) % 60 ;
        minute = (time / 100) / 60 ;
    
        NSString *zeroString = @"0";
        self.countDownTimeLabel.text = [NSString stringWithFormat:@"%@%d:%@%d:%@%d",
                                        (minute<10?zeroString:@""), minute,
                                        (second<10?zeroString:@""), second,
                                        (last<10?zeroString:@""), last
                                        ];
    
    }
    - (void)timerAction:(NSTimer *)t
    {
        _keepSecond ++;
        NSArray *visibleCells = self.tableView.visibleCells;
        for (UITableViewCell *cell in visibleCells) {
            if ([cell isKindOfClass:[PrizeWillOpenCell class]]) {
                PrizeWillOpenCell *realCell = (PrizeWillOpenCell *)cell;
                NSIndexPath *indexPath = [self.tableView indexPathForCell:realCell];
                NSInteger count = indexPath.row;
                OpenPrizeObject *itemOne = [self.productLists objectAtIndex:count];
                [realCell updateTimeOne:(itemOne.countDownTime - self.keepSecond)];
            }
        }
    }

    希望对大家有帮助
    [广告]想学习IOS,安卓开发,没有思路?加入群:152347008 来学习吧。 有偿教学!

    欢迎使用Markdown编辑器写博客

    本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:

    • Markdown和扩展Markdown简洁的语法
    • 代码块高亮
    • 图片链接和图片上传
    • LaTex数学公式
    • UML序列图和流程图
    • 离线写博客
    • 导入导出Markdown文件
    • 丰富的快捷键

    快捷键

    • 加粗 Ctrl + B
    • 斜体 Ctrl + I
    • 引用 Ctrl + Q
    • 插入链接 Ctrl + L
    • 插入代码 Ctrl + K
    • 插入图片 Ctrl + G
    • 提升标题 Ctrl + H
    • 有序列表 Ctrl + O
    • 无序列表 Ctrl + U
    • 横线 Ctrl + R
    • 撤销 Ctrl + Z
    • 重做 Ctrl + Y

    Markdown及扩展

    Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— [ 维基百科 ]

    使用简单的符号标识不同的标题,将某些文字标记为粗体或者斜体,创建一个链接等,详细语法参考帮助?。

    本编辑器支持 Markdown Extra ,  扩展了很多好用的功能。具体请参考Github.

    表格

    Markdown Extra 表格语法:

    项目 价格
    Computer $1600
    Phone $12
    Pipe $1

    可以使用冒号来定义对齐方式:

    项目 价格 数量
    Computer 1600 元 5
    Phone 12 元 12
    Pipe 1 元 234

    定义列表

    Markdown Extra 定义列表语法:
    项目1
    项目2
    定义 A
    定义 B
    项目3
    定义 C

    定义 D

    定义D内容

    代码块

    代码块语法遵循标准markdown代码,例如:

    @requires_authorization
    def somefunc(param1='', param2=0):
        '''A docstring'''
        if param1 > param2: # interesting
            print 'Greater'
        return (param2 - param1 + 1) or None
    class SomeClass:
        pass
    >>> message = '''interpreter
    ... prompt'''

    脚注

    生成一个脚注1.

    目录

    [TOC]来生成目录:

    数学公式

    使用MathJax渲染LaTex 数学公式,详见math.stackexchange.com.

    • 行内公式,数学公式为:Γ(n)=(n1)!n
    • 块级公式:

    x=b±b24ac2a

    更多LaTex语法请参考 这儿.

    UML 图:

    可以渲染序列图:

    Created with Raphaël 2.1.0张三张三李四李四嘿,小四儿, 写博客了没?李四愣了一下,说:忙得吐血,哪有时间写。

    或者流程图:

    Created with Raphaël 2.1.0开始我的操作确认?结束yesno
    • 关于 序列图 语法,参考 这儿,
    • 关于 流程图 语法,参考 这儿.

    离线写博客

    即使用户在没有网络的情况下,也可以通过本编辑器离线写博客(直接在曾经使用过的浏览器中输入write.blog.csdn.net/mdeditor即可。Markdown编辑器使用浏览器离线存储将内容保存在本地。

    用户写博客的过程中,内容实时保存在浏览器缓存中,在用户关闭浏览器或者其它异常情况下,内容不会丢失。用户再次打开浏览器时,会显示上次用户正在编辑的没有发表的内容。

    博客发表后,本地缓存将被删除。 

    用户可以选择 把正在写的博客保存到服务器草稿箱,即使换浏览器或者清除缓存,内容也不会丢失。

    注意:虽然浏览器存储大部分时候都比较可靠,但为了您的数据安全,在联网后,请务必及时发表或者保存到服务器草稿箱

    浏览器兼容

    1. 目前,本编辑器对Chrome浏览器支持最为完整。建议大家使用较新版本的Chrome。
    2. IE9以下不支持
    3. IE9,10,11存在以下问题
      1. 不支持离线功能
      2. IE9不支持文件导入导出
      3. IE10不支持拖拽文件导入


    1. 这里是 脚注内容.
    展开全文
  • iOS9的时候主要提供的是录屏,录制完成后可以进行查看、编辑、通过指定方式分享出去。在WWDC16上新版的 ReplayKit 提出了了 live 功能,简单说就是通过 ReplayKit 可以进行录屏直播。这对于苹果的手游直播行业有着...
  • - POP是一个来自于Facebook,在iOS与OSX上通用的极具扩展性的动画引擎。它在基本的静态动画的基础上增加的弹簧动画与衰减动画,使之能创造出更真实更具物理性的交互动画。 - Pop Animation在使用上和Core Animation...
  • iOS触摸事件全面解析

    2018-09-07 16:48:07
    本文主要讲解iOS触摸事件的一系列机制,涉及的问题大致包括: 触摸事件由触屏生成后如何传递到当前应用? 应用接收触摸事件后如何寻找最佳响应者?实现原理? 触摸事件如何沿着响应链流动? 响应链、手势识别器...
  • 今天工作需要,便找了一些方法,在百度上找了很久全是这样的...我们如果提交给AppStore,苹 果当然就管着了,呵呵。  实现方法来自于iPhone Dev SDK Forum:  读取屏幕亮度:  NSNumber *bl = (NSNumber*)
  • 在util中封装方法 function countdown(that) { // 渲染倒计时时钟 // console.log(that.data.times) if (that.data.times <= 0) { // 结束倒计时 that.setData({ day: dateformats(0)...
  • 50天iOS挑战(Swift) - 第一天:秒表计时
  • 好奇触摸事件是如何从屏幕转移到APP内的? ... 纠结于如何实现这个奇葩响应需求?...本文主要讲解iOS触摸事件的一系列机制,涉及的问题大致包括: 触摸事件由触屏生成后如何传递到当前应用? ...
  • 转载: NSTimer的使用方法 1、初始化 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; ...
  • <iOS> 谈谈iOS Animation

    2012-12-24 14:30:30
    这里没有太多的代码细节,只是探索iOS动画的基本概念,以及其抽象模型,数学基础等.我们学习一个知识的时候一般有两个部分,抽象部分和形象部分,抽象好比语言的语法,是规则,形象好比具体的句子,可以用来和别人交流的....
  • iOS中高级面试题

    2019-12-29 14:27:41
    iOS基础 1:讲讲你对atomic & nonatomic的理解 1、原子操作对线程安全并无任何安全保证。被 atomic 修饰的属性(重载设置器和访问器)只保证了对数据读写的完整性,也就是原子性,但是与对象的线程安全无关...
  • .一. 日期选择器 (UIDatePicker)1. UIDatePicker 控件属性(1) Style 属性 ....一. 日期选择器 (UIDatePicker)1. UIDatePicker 控件属性(1) Style 属性 一. 分段控件 (UISegmentedControl)控件展示 : 1....
  • 谈谈iOS Animation

    2015-12-08 18:15:41
    这里没有太多的代码细节,只是探索iOS动画的基本概念,以及其抽象模型,数学基础等.我们学习一个知识的时候一般有两个部分,抽象部分和形象部分,抽象好比语言的语法,是规则,形象好比具体的句子,可以用来和别人交流的....
  • 标签:「iOS」「定时 」 作者: dac_1033 审校: QiShare团队 定时器用于延迟一段时间或在指定时间点执行特定的代码,之前我们介绍过iOS中处理定时任务常用方法,通过不同方法创建的定时器,其可靠性与精度都有...
  • 效果图: 首先将图片裁剪成圆形 先介绍一下CALayer 1.CALayer(层)是屏幕上的一个矩形区域,在每一个UIView中都包含一个CALayer,CALayer负责UIView的视图显示。 2.跟UIView的关系图: ...在 iOS ...
  • IOS animation

    2017-04-06 18:06:56
    原文地址:animation">IOS animation作者:小_Paul 零.前言 这里没有太多的代码细节,只是探索iOS动画的基本概念,以及其抽象模型,数学基础等.我们学习一个知识的时候一般有两个部分,抽象部分和形象部分,抽象 好比...
1 2 3 4 5 ... 18
收藏数 357
精华内容 142
关键字:

0.01秒计时不准确 ios