2的根号 ios

2016-09-12 08:49:22 C_Lluckying 阅读数 3915


对勾提示动画能胜任很多提示场合的任务,比如网页加载完成、登录成功等等。这类动画各个大牛都有很好的demo封装,不过能自己掌握其原理并能自己根据情况封装一个那当然是最好的了。
下边是我用贝塞尔类画的对勾动画

动画设计比较简单,下边我贴出了整个View的代码……

#import "SuccessView.h"

@implementation SuccessView
{
    UIView *_logoView;
}

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self drawSuccessLine];

    }
    return self;
}

- (void)drawSuccessLine{

    [_logoView removeFromSuperview];
    _logoView = [[UIView alloc] initWithFrame:self.frame];
    //曲线建立开始点和结束点
    //1. 曲线的中心
    //2. 曲线半径
    //3. 开始角度
    //4. 结束角度
    //5. 顺/逆时针方向
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.center.x, self.center.y) radius:self.frame.size.width/2.0 startAngle:0 endAngle:M_PI*2 clockwise:YES];
    //对拐角和中点处理
    path.lineCapStyle  = kCGLineCapRound;
    path.lineJoinStyle = kCGLineCapRound;

    //对号第一部分直线的起始
    [path moveToPoint:CGPointMake(self.frame.size.width/5, self.frame.size.width/2)];
    CGPoint p1 = CGPointMake(self.frame.size.width/5.0*2, self.frame.size.width/4.0*3);
    [path addLineToPoint:p1];

    //对号第二部分起始
    CGPoint p2 = CGPointMake(self.frame.size.width/8.0*7, self.frame.size.width/4.0+8);
    [path addLineToPoint:p2];

    CAShapeLayer *layer = [[CAShapeLayer alloc] init];
    //内部填充颜色
    layer.fillColor = [UIColor clearColor].CGColor;
    //线条颜色
    layer.strokeColor = [UIColor orangeColor].CGColor;
    //线条宽度
    layer.lineWidth = 1;
    layer.path = path.CGPath;
//动画设置
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:NSStringFromSelector(@selector(strokeEnd))];
    animation.fromValue = @0;
    animation.toValue = @1;
    animation.duration = 2;
    [layer addAnimation:animation forKey:NSStringFromSelector(@selector(strokeEnd))];

    [_logoView.layer addSublayer:layer];
    [self addSubview:_logoView];
}
@end

在需要用地方直接创建一个对象就可以了

- (void)showSuccess{

    SuccessView *suc = [[SuccessView alloc]initWithFrame:CGRectMake(0, 0, 60, 60)];
    suc.center = self.view.center;
    [self.view addSubview:suc];
}
2018-05-16 15:11:19 github_36843038 阅读数 1971

目录

简介

开根号算法
√n = a;
我们要求开根号的算法结果,实际上就是求a的值,所以,这里我们需要转换思维,也就是求满足a^2 = n中a的值.

原理

这里采用二分法,主要原理:

  1. 开平方的得到的结果数字,小于或者等于被开方数
  2. 而且中间数平方大于被开方数,则接下来缩小区域在中间值的左侧,反之在右侧;
  3. 存在的误差范围,如果在误差允许范围内,即可得到开放结果

代码

- (CGFloat)sqrtNumber:(CGFloat)number {
    CGFloat sqrtNumber = 0;
    if (number < 0) {
        // 这里根据实际情况做处理,简单的返回-1,可以根据-1情况进行处理
        sqrtNumber = -1;
    } else {
    // 下面是最主要的
        // 定义变量
        CGFloat oldRangeMid; // 记录上次运算的中间值
        CGFloat newRangeMid; // 生成新的中间值
        CGFloat rangeLeft; // 二分法区间的起始数
        CGFloat rangeRight; // 二分法区间的截止数

        // 初始化
        rangeLeft = 0;
        rangeRight = number;
        newRangeMid = oldRangeMid = (rangeLeft + rangeRight) / 2;

        do {
        // 满足条件,二分法缩小判断范围
            if (newRangeMid * newRangeMid > number) {
                rangeRight = newRangeMid;
            } else {
                rangeLeft = newRangeMid;
            }
            // 重新赋值,判断并且是否进入下一步的运算
            oldRangeMid = newRangeMid;
            newRangeMid = (rangeRight + rangeLeft) / 2;
            // 下面的判断是比较重要的
            // 我们需要判断新的Mid的值和旧的Mid的值的差值是不是在Float的精确度的允许误差范围之内,
            // 如果在误差范围之内,那么新的Mid就是我们需要得到的数值
            // 如果不在误差范围之内,那么继续进入下一步的运算,一直到满足
        } while (fabs(newRangeMid - oldRangeMid) > FLT_EPSILON);
        // 满足结果,赋值
        sqrtNumber = newRangeMid;
    }
    // 返回求得的开方数
    return sqrtNumber;
}

补充:

FLT_EPSILON,这个是OC中的代表浮点的精确度,在c语言中,可以用eps.

#define FLT_EPSILON __FLT_EPSILON__
#define DBL_EPSILON __DBL_EPSILON__
#define LDBL_EPSILON __LDBL_EPSILON__
2014-02-07 15:13:57 chenyong05314 阅读数 15539

转载自:http://blog.sina.com.cn/s/blog_71715bf80101bnvn.html

介绍一下Objective-c常用的函数,常数变量

算术函数

【算术函数】
函数名 说明
int rand() 随机数生成。
(例)
srand(time(nil)); //随机数初期化
int val = rand()P; //0~49之间的随机数
int abs(int a) 整数的绝对值
(例)int val = abs(-8);
 →8
※浮点数的时候用fabs。
double fabs(double a) 浮点数的绝对值
(例)double val = fabs(-12.345);
 →12.345
※整数的时候用abs。
double floor(double a) 返回浮点数整数部分(舍弃小数点)
(例)double val = floor(12.345);
 →12.000
double ceil(double a); 返回浮点数整数部分(舍弃小数点部分,往个位数进1)
(例)double val = ceil(12.345);
 →13.000
double pow(double a, double b) a的b次方
(例)double val = pow(2, 3);
 →8
double sqrt(double a) a的平方根
(例)double val = sqrt(2);
 →1.41421356

三角函数

【三角函数】
函数名 说明
double cos(double a) 余弦函数 (a:弧度)
double sin(double a) 正弦函数 (a:弧度)
double tan(double a) 正切函数 (a:弧度)
double asin(double a) 反正弦值 (a:弧度)
double acos(double a) 反余弦函数(a:弧度)
double atan(double a) 反正切函数
double atan2(double a, double b) 返回给定的 a 及 b 坐标值的反正切值

指数函数

【指数函数】
函数名 说明
double log(double a) 以e 为底的对数值
double log10(double a) 对数函数log

常数

常数
常数名 说明
M_PI 圆周率(=π)
M_PI_2 圆周率的1/2(=π/2)
M_PI_4 圆周率的1/4(=π/4)
M_1_PI =1/π
M_2_PI =2/π
M_E =e
M_LOG2E log_2(e)
M_LOG10E log_10(e)

2015-12-21 21:34:06 gu_jin_xiao 阅读数 1020

转自:http://www.cnblogs.com/tandaxia/p/5060123.html


1、截至目前为止,主流的iOS设备屏幕有以下几种:

 

---------------  iPhone  ---------- --------  iPad ------------

 

2、iOS设备屏幕分辨率:(ppi是像素密度单位【像素/英寸】,401ppi表示每英寸上有401个像素)

  

  ppi(pixel per inch)计算,以6Plus为例:

  屏幕分辨率1920 x 1080,  屏幕尺寸5.5英寸(手机屏幕对角物理线的长度),

  1920 x 1920 + 1080 x 1080 = 4852800, 开根号为:2202.907...

  2202.907 / 5.5 = 400.528 ppi, 大约就是401ppi

 

3、iOS的三种分辨率

   1)、资源分辨率:资源图片的大小,单位是像素。

   2)、设计分辨率:逻辑上的屏幕大小,单位是点。我们在Interface Builder设计器中的单位和程序代码中的单位都是设计分辨率中的“点”。

   3)、是以像素为单位的屏幕大小,所有的应用都会渲染到这个屏幕上展示给用户。

     iPhone 6 Plus和 6S Plus是最为特殊的设备,资源分辨率与屏幕分辨率的比例是1.15 : 1, 而其他的设备比例是1 : 1。不同的人群关注的分辨率也是不同的,UI设计人员主要关注的是资源分辨率,开发人员主要关注的是设计分辨率,而一般用户主要关注的屏幕分辨率。

  

 4、获取设备屏幕信息

  获取当前移动设备对象:[UIDevice currentDevice]

  UIDevice类所有信息

复制代码
NS_CLASS_AVAILABLE_IOS(2_0) @interface UIDevice : NSObject 

+ (UIDevice *)currentDevice;

@property(nonatomic,readonly,strong) NSString    *name;              // e.g. "My iPhone"
@property(nonatomic,readonly,strong) NSString    *model;             // e.g. @"iPhone", @"iPod touch"
@property(nonatomic,readonly,strong) NSString    *localizedModel;    // localized version of model
@property(nonatomic,readonly,strong) NSString    *systemName;        // e.g. @"iOS"
@property(nonatomic,readonly,strong) NSString    *systemVersion;     // e.g. @"4.0"
@property(nonatomic,readonly) UIDeviceOrientation orientation __TVOS_PROHIBITED;       // return current device orientation.  this will return UIDeviceOrientationUnknown unless device orientation notifications are being generated.

@property(nullable, nonatomic,readonly,strong) NSUUID      *identifierForVendor NS_AVAILABLE_IOS(6_0);      // a UUID that may be used to uniquely identify the device, same across apps from a single vendor.

@property(nonatomic,readonly,getter=isGeneratingDeviceOrientationNotifications) BOOL generatesDeviceOrientationNotifications __TVOS_PROHIBITED;
- (void)beginGeneratingDeviceOrientationNotifications __TVOS_PROHIBITED;      // nestable
- (void)endGeneratingDeviceOrientationNotifications __TVOS_PROHIBITED;

@property(nonatomic,getter=isBatteryMonitoringEnabled) BOOL batteryMonitoringEnabled NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED;  // default is NO
@property(nonatomic,readonly) UIDeviceBatteryState          batteryState NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED;  // UIDeviceBatteryStateUnknown if monitoring disabled
@property(nonatomic,readonly) float                         batteryLevel NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED;  // 0 .. 1.0. -1.0 if UIDeviceBatteryStateUnknown

@property(nonatomic,getter=isProximityMonitoringEnabled) BOOL proximityMonitoringEnabled NS_AVAILABLE_IOS(3_0); // default is NO
@property(nonatomic,readonly)                            BOOL proximityState NS_AVAILABLE_IOS(3_0);  // always returns NO if no proximity detector

@property(nonatomic,readonly,getter=isMultitaskingSupported) BOOL multitaskingSupported NS_AVAILABLE_IOS(4_0);

@property(nonatomic,readonly) UIUserInterfaceIdiom userInterfaceIdiom NS_AVAILABLE_IOS(3_2);

- (void)playInputClick NS_AVAILABLE_IOS(4_2);  // Plays a click only if an enabling input view is on-screen and user has enabled input clicks.

@end
复制代码

 

 ios移动设备类型枚举判断:

typedef NS_ENUM(NSInteger, UIUserInterfaceIdiom) {
    UIUserInterfaceIdiomUnspecified = -1,
    UIUserInterfaceIdiomPhone NS_ENUM_AVAILABLE_IOS(3_2), // iPhone and iPod touch style UI
    UIUserInterfaceIdiomPad NS_ENUM_AVAILABLE_IOS(3_2), // iPad style UI
    UIUserInterfaceIdiomTV NS_ENUM_AVAILABLE_IOS(9_0), // Apple TV style UI
};

[UIDevice currentDevice].userInterfaceIdiom ==  UIUserInterfaceIdiomPhone  // 表示iPhone设备

[UIDevice currentDevice].userInterfaceIdiom ==  UIUserInterfaceIdiomPad     // 表示iPad设备

[UIDevice currentDevice].userInterfaceIdiom ==  UIUserInterfaceIdiomTV  // 表示Apple TV设备

[UIDevice currentDevice].userInterfaceIdiom ==  UIUserInterfaceIdiomUnspecified  // 表示未知设备

 

//示例:详细判断iPhone设备类型

复制代码
//详细判断iPhone设备信息, 区分横屏和竖屏
    if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone){
        //获取屏幕尺寸信息
        CGSize screenSize = [UIScreen mainScreen].bounds.size;
        
        //竖屏情况
        if (screenSize.height > screenSize.width){
            if (screenSize.height == 568){
                //iPhone 5/5S/5C (iPod / iPod touch) 等设备
            }
            else if (screenSize.height == 667){
                //iPone 6 / 6S 等设备
            }
            else if (screenSize.height == 736){
                //iPone 6 Plus / 6S Plus 等设备
            }
            else{
                //iPhone 4 / 4S 等设备
            }
        }
        
        //横屏情况
        if (screenSize.width > screenSize.height){
            if (screenSize.width == 568){
                //iPhone 5/5S/5C (iPod / iPod touch) 等设备
            }
            else if (screenSize.width == 667){
                //iPone 6 / 6S 等设备
            }
            else if (screenSize.width == 736){
                //iPone 6 Plus / 6S Plus 等设备
            }
            else{
                //iPhone 4 / 4S 等设备
            }
        }
    }
复制代码

//说明:在iPad和iPhone屏幕中,一般会有状态栏、标签栏、导航栏(或工具栏)以及内容视图部分,它们的尺寸也是固定的。状态栏占20点,导航栏占44点,标签栏占49点。

 

原文链接:http://www.cnblogs.com/tandaxia/p/5060123.html