作者: xiao, yanzi

【ios】swift教程

学习swift地址
https://docs.swift.org/swift-book/GuidedTour/GuidedTour.html
和其他语言比起来,语法层次确实有些不一样的地方。

在wwdc2019上看到了苹果公司关于swiftui的介绍,感觉这就是未来。
Parentheses()
brackets[]
braces{}

Swift编程语言简介
Swift命令行操作

1 Swift defines away large classes of common programming errors by adopting modern programming patterns:
2
3 Variables are always initialized before use.
4 Array indices are checked for out-of-bounds errors.
5 Integers are checked for overflow.
6 Optionals ensure that nil values are handled explicitly.
7 Memory is managed automatically.
8 Error handling allows controlled recovery from unexpected failures.

A swift tour
下面的内容如果你有不理解的请不要太过于悲观,我们将会在以后继续学习

Simple Values
let 定义常量
var 定义变量

Control Flow
Use if and switch to make conditionals, and use for-in, while, and repeat-while to make loops. Parentheses around the condition or loop variable are optional. Braces around the body are required.

1 if true {
2 print(“this is true”)
3 } else{
4 print(“this is not true”)
5 }
6 var tmp = “”
7 switch tmp{
8 case “1”:
9
10
11
12
13
14 }
15
16 for i in [1, 3, 5,7,9]{
17
18 }
19 for i in 1..<5{
20 print(i)
21 }
22 for i in 1…5{
23 print(i)
24 }

 

1 while condition {
2
3 }

 

1 repeat {
2     print(“至少执行一次”)
3 }while 2 < 1
4

函数和闭包
By default, functions use their parameter names as labels for their arguments. Write a custom argument label before the parameter name, or write _ to use no argument label.

1 func greet(person: String, day: String) -> String {
2     return “Hello \(person), today is \(day).”
3 }
4 greet(person: “Bob”, day: “Tuesday”)

对象和类

实例话一个类

Enumerations and Structures
Protocols and Extensions
Error Handling
异常捕获

iOS开发之Swift教程01-Swift基础

【主要内容】

1.关于Swift

2.Hello World

3.常量和变量

4.类型标注

5.常量和变量的命名

6. 输出常量和变量
7.注释

8.分号

一、关于Swift

苹果在2014年WWDC(苹果开发者大会)发布了Swift,用于编写iOS,Mac OS X和watchOS应用程序。Swift 采用安全的编程模式并添加了很多新特性,而且对于熟悉OC人开发者来说学习Swift也很简单。是不是已经迫不及待要体验Swift了。

二、Hello World

在学习计算机每一门语言的时候*个程序肯定都是Hello World,Swift也一样,下边来看一下Swift如何打印Hello World。print(“Hello World”)
就是这么简单不需要多余的字符或者导入一个库。重要的事情说三遍:在Swift中不需要在每句的结尾加分号!在Swift中不需要在每句的结尾加分号!在Swift中不需要在每句的结尾加分号!

三、常量和变量

常量和变量应该是每一门语言里边都存在的。常量就是在定义之后就不可以再改变的量,而变量就是定义之后还可以改变他的值。那么在Swift中使用let来声明常量,使用var来声明变量。注意常量和变量必须在使用前声明。

下边用常量定义你的身高,用变量定义你的年龄:

//定义常量用let 用常量定义身高
let height = 187

//定义变量用var 变量定义年龄
var age = 35
age = 36
上边声明一个你的身高的常量height,并给它初值187,因为人的身高到一定年龄后是不会再变的。有声明一个你的年龄的变量age,赋初值35,因为年龄每年是可以变化的,今年35岁明年就36岁。
你也可以同时定义多个常量或者变量,只需要用逗号隔开:

//同时定义多个常量和变量
let a = 10, b = 27, c = 58
var d = 3.14, e = 6.28, f = 5.28

注意:

在Swift中如果你声明变量而没有重新改变变量的值,那么编译器会警告你:你的变量XXX永远不会改变,建议你使用let声明成常量,如图:

%title插图%num

四、类型标注

当你声明变量或者常量的时候可以加上类型标注(type annotation),说明变量或者常量中要储存的值的类型。格式如下:

//类型标注格式:
//变量/常量 变量名/常量名:类型 = 初始值
let number: Int = 1250
var name: String = “Aventador”
name = “Ferrari”
跟普通定义不同的是,带有类型标注的声明需要在变量名/常量名后边加上一个冒号,冒号后边是类型说明。
用类型标注同样可以同时定义多个变量:

//类型标注同时定义多个变量
var carName,carBrand,carHeight: String
注意:
在Swift中一般很少去写类型标注,因为Swift是一门安全的语言,他有类型安全和类型推断,这个会在后边提到。如果初始化声明的时候没有标注类型,系统会自动推断出变量的类型。

五、常量和变量的命名规则

5.1 你可以用任何的Unicode字符命名

5.2 不能包含数学符号、箭头、保留的(或者非法的)Unicode码位

5.3 不能用连线和制表符

5.4 不能以数字开头,但是可以再名字其他地方出现

5.5 不能重复声明变量名、常量名

你可以像下边这样命名:

%title插图%num

六、输出常量、变量

在Swift中可以用  print(items : Any)函数来输出当前常量或者变量的值:

%title插图%num

Swift 用字符串插值(string interpolation)的方式把常量名或者变量名当做占位符加入到长字符串中,Swift 会用当前常量或变量的值替换这些占位符。

将常量或变量名放入圆括号中,并在开括号前使用反斜杠将其转义:

print(“我的*车是\(_car)”)

七、注释

Swift中注释跟OC基本一样,但是Swift要比OC功能更强。可以使用多行注释嵌套,在OC中是不可以的,如图:

%title插图%num

八、分号

大部分编程语言在每条语句结尾的地方都需要加上分号表示结束。但是在Swift中不强制大家必须写分号,不写没有任何问题,但是写了也不错。

但是有一种情况必须写分号,就是想要在一行中执行多条语句的时候,如图:

%title插图%num

 

iOS 使用UIBezierPath实现不等距曲线图

iOS,关于画线有很多很好的第三方,比如Charts、ECharts等等,但是我没有找到画不等距的,就自己简单的实现了一下。首先看,效果

%title插图%num

就是描点画线加动画,没有太难的。
我自定义了一个LineChartView,和几个模型,具体demo下面会给链接

%title插图%num

给lineChartview暴露出了几个属性和方法,都有注释

%title插图%num

在controller里面进行初始化配置

%title插图%num

setChartView方法

s

1 self.chartView.y_TextFont = [UIFont systemFontOfSize:14];
2     self.chartView.minValue = 0;
3     self.chartView.maxValue = 100;
4     NSArray *x_names = @[@”清醒”,@”一般”,@”黄金”];
5     NSArray *xValue = @[@0,@50,@100];
6     NSArray *x_colors = @[[UIColor redColor],[UIColor orangeColor],[UIColor yellowColor]];
7     NSMutableArray *xAxis = [NSMutableArray new];
8     for (int i = 0; i < x_names.count; i++) {
9         XJYAxisModel * model = [XJYAxisModel new];
10         model.clolor = x_colors[i];
11         model.value = xValue[i];
12         model.title = x_names[i];
13         [xAxis addObject:model];
14     }
15     [self.chartView drawLineChartViewWithX_Value_Names:xAxis xCount:xCount];

我在controller里面定义了个方法setXAxis,用于设置x轴线上的模型具体实现

1 – (NSArray *)setXAxis{
2 //    *大值和*小值 -> 每个轴线上的值 , 比如*大值90,*小值是0,10条轴线(9个间隙),则每条轴线的间距是10(0、10、20、30、40、50、60、70、80、90)
3     float min = 0;
4     float max = 90;
5     float space = (max – min)/(xCount – 1);
6     NSMutableArray *xAxisArr = [NSMutableArray new];
7     for (int i = 0 ; i < xCount; i++) {
8         XJXAxisModel *model  = [XJXAxisModel new];
9         model.value = [NSNumber numberWithFloat: i * space];
10         model.title = [NSString stringWithFormat:@”12:0%d”,i];
11         model.clolor = [UIColor whiteColor];
12         model.textFont = [UIFont systemFontOfSize:10];
13         [xAxisArr addObject:model];
14     }
15
16     return xAxisArr;
17 }

页面上弄了一个按钮,用于触发赋值,

1 – (void)refreshData{
2     static int a = 0;
3     if (a == 0) {
4         NSMutableArray *datas = [NSMutableArray new];
5             NSArray *valueXs = @[@0,@5,@11,@19,@25,@31,@39,@43,@51,@59,@70,@85,@90];
6             NSArray *valueYs = @[@0,@10,@55,@99,@88,@99,@77,@87,@10,@53,@80,@10,@0];
7             for (int i = 0; i < valueXs.count; i++) {
8                 XJDataModel *model = [XJDataModel new];
9                 model.xValue = valueXs[i];
10                 model.yValue = valueYs[i];
11                 [datas addObject:model];
12             }
13         [self.chartView drawLineChartViewWithDataModels:datas withXAxisData:[self setXAxis]];
14         a = 1;
15     }else{
16         NSMutableArray *datas = [NSMutableArray new];
17             NSArray *valueXs = @[@0,@5,@11,@19,@25,@31,@39,@43,@51,@59,@70,@85,@90];
18             NSArray *valueYs = @[@0,@90,@55,@9,@88,@19,@77,@87,@10,@93,@80,@10,@0];
19             for (int i = 0; i < valueXs.count; i++) {
20                 XJDataModel *model = [XJDataModel new];
21                 model.xValue = valueXs[i];
22                 model.yValue = valueYs[i];
23                 [datas addObject:model];
24             }
25         [self.chartView drawLineChartViewWithDataModels:datas withXAxisData:[self setXAxis]];
26         a = 0;
27     }
28 }

在画线的具体实现里面,先赋值x轴文案,然后描点画线并设置动画效果

1 – (void)drawLineChartViewWithDataModels:(NSArray<XJDataModel *> *)datas withXAxisData:(NSArray< XJXAxisModel * >*)xAxis{
2     [self reset];
3 //    1. 设置x轴文案
4     [self setXAxisData:xAxis];
5     if (datas.count == 0) {
6         return;
7     }
8 //    [shapeLayer removeFromSuperlayer];
9     //2.获取目标值点坐标
10     NSMutableArray *allPoints = [NSMutableArray array];
11     for (int i = 0; i < datas.count; i++) {
12         XJDataModel *model = [datas objectAtIndex:i];
13         float Y = y_start – scaleY * model.yValue.floatValue;
14         float X = x_start + scaleX * model.xValue.floatValue;
15         NSLog(@”X,Y = (%.2f,%.2f)”,X,Y);
16         CGPoint point = CGPointMake(X, Y);
17         [allPoints addObject:[NSValue valueWithCGPoint:point]];
18     }
19
20 //    画线
21     UIBezierPath *path = [UIBezierPath bezierPath];
22     [path moveToPoint:[allPoints[0] CGPointValue]];
23     CGPoint PrePonit;
24     for (int i =0; i<allPoints.count; i++) {
25         if (i==0) {
26             PrePonit = [allPoints[0] CGPointValue];
27         }else{
28             CGPoint NowPoint = [allPoints[i] CGPointValue];
29             [path addCurveToPoint:NowPoint controlPoint1:CGPointMake((PrePonit.x+NowPoint.x)/2, PrePonit.y) controlPoint2:CGPointMake((PrePonit.x+NowPoint.x)/2, NowPoint.y)]; //三次曲线
30             PrePonit = NowPoint;
31         }
32     }
33     shapeLayer = [CAShapeLayer layer];
34     shapeLayer.path = path.CGPath;
35     shapeLayer.lineWidth = 2.0;
36     shapeLayer.strokeColor = [UIColor orangeColor].CGColor;
37     shapeLayer.fillColor = [UIColor clearColor].CGColor;
38     shapeLayer.borderWidth = 3.0;
39     [self.subviews[0].layer addSublayer:shapeLayer];
40 //    加动画
41     CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@”strokeEnd”];
42     animation.duration = 1.0;
43     animation.fromValue = @0.0f;
44     animation.toValue = @1.0f;
45     [shapeLayer addAnimation:animation forKey:@”strokeEnd”];
46     for (int i = 0; i < datas.count; i++) {
47         CGPoint point =[allPoints[i] CGPointValue];
48         UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(point.x-2.5, point.y-2.5, 5, 5) cornerRadius:5];
49         CAShapeLayer *layer = [CAShapeLayer layer];
50         layer.strokeColor = [UIColor whiteColor].CGColor;
51         layer.fillColor = [UIColor whiteColor].CGColor;
52         layer.path = path.CGPath;
53         [self.subviews[0].layer addSublayer:layer];
54         [pointShapeLayers addObject:layer];
55     }
56 }

 

iOS 高德室内地图导航功能的简单实现

打开高德官网:http://lbs.amap.com/ ,并注册、登录,在控制台中创建应用,拿到Key值。

点击iOS室内地图SDK

%title插图%num

开发文档:http://lbs.amap.com/api/ios-indoor-sdk/summary/ ,在下面有相关下载,下载SDK

然后按照开发文档创建和配置工程,另外需要申请室内地图的数据,才能用。

%title插图%num

%title插图%num

首先,在ViewController里面,导入sdk

#import <IndoorMapSDK/IndoorMapSDK.h>

#import <OnlineLocationSDK/OnlineLocationSDK.h>

然后继承:OIMMapViewDelegate(室内地图),OIMRoutePlanningDelegate(线路规划)

创建对象:

@property (nonatomic,strong) OIMMapView *imapView;

//室内地图路算对象

@property(nonatomic, strong)OIMRoutePlanning* imRoutePlanning;

//路算起点

@property(nonatomic, strong)OIMFeature* selectedFeature;

//路算起点

@property(nonatomic, strong)OIMFeature* routePlanningStart;

在viewDidLoad方法里面初始化OIMMapView

_imapView = [[OIMMapView alloc]initWithFrame:self.view.bounds];

//    _imapView.showsIndoorMap = YES;

_imapView.key = App_key;

[_imapView setBuildingId:BuildingId floorNo:1];

_imapView.delegate = self;

_imapView.showRoutePlanning = YES;

_imapView.showLocationPoint = YES;

_imapView.showZoomControl = NO;

 

[self.view addSubview:_imapView];

其中,App_key是在官网创建应用给的key,BuildingId是申请室内地图数据时,高德给的BuildingId;

然后实现代理方法

#pragma mark – OIMMapViewDelegate

-(void)mapView:(OIMMapView *)mapView didFinishLoadingMap:(NSString *)buildingId floorNo:(int)floorNo

{

}

-(void)mapView:(OIMMapView*)mapView didFailLoadingMap:(NSString*)buildingId floorNo:(int)floorNo withError:(NSError *)error{
[self alert:error.description message:@””];

 

}

//加载楼层

-(void)mapView:(OIMMapView*)mapView willStartLoadingFloor:(NSString*)buildingId floorNo:(int)floorNo{
}

-(void)mapView:(OIMMapView*)mapView didFinishLoadingFloor:(NSString*)buildingId floorNo:(int)floorNo{

}

/*!

*  @brief  点击地图完成

*

*  @param mapView 室内地图对象

*  @param feature 点击的POI

*

*  @since 2.0.0

*/

-(void)mapView:(OIMMapView*)mapView didClickFeature:(OIMFeature*)feature{
//清除所有的选择气泡显示

[self.imapView clearStatus:OIMFeatureStatus_Selected];

//清除所有的高亮显示

[self.imapView setFeature:self.selectedFeature highlight:NO];

//设置点击的对象显示气泡

[self.imapView setFeature:feature status:OIMFeatureStatus_Selected];

//设置点击的对象高亮

[self.imapView setFeature:feature highlight:YES];

self.selectedFeature = feature;

//如果还没有路算起点

if(self.routePlanningStart==nil)

{
//清除路算结果

[self.imapView setShowRoutePlanning:NO];

//设置路算起点

self.routePlanningStart = feature;

//设置路算起点图标

[self.imapView setFeature:feature status:OIMFeatureStatus_RouteStart];

//清除路算终点图标

[self.imapView clearStatus:OIMFeatureStatus_RouteStop];

//清除选择图标

[self.imapView clearStatus:OIMFeatureStatus_Selected];

 

}

else

{
//显示路算结果

[self.imapView setShowRoutePlanning:YES];

//设置路算终点图标

[self.imapView setFeature:feature status:OIMFeatureStatus_RouteStop];

//清除选择图标

[self.imapView clearStatus:OIMFeatureStatus_Selected];

if(self.imRoutePlanning == nil)

{
//初始化室内路算对象

self.imRoutePlanning = [[OIMRoutePlanning alloc]initWithDelegate:self];

//设置路算对象的KEY

self.imRoutePlanning.key = App_key;

}

//路算请求

[self.imRoutePlanning requestRoutePlanning:BuildingId fromPoiId:self.routePlanningStart.pid toPoiId:feature.pid];

//清除路算起点

self.routePlanningStart = nil;

 

}

 

}

这样我们就可以在室内设置起点和终点然后规划路线了。

%title插图%num
其实按照sdk的文档,我们可以拿到某个楼层上的所有模块的信息:

%title插图%num%title插图%num%title插图%num

NSArray* floorList = [self.imapView getFloorList];

NSLog(@”%@”,floorList);

但是他返回的

(

(null)[0]B1,

(null)[0]F1,

(null)[0]F2,

(null)[0]F3,

(null)[0]F4,

(null)[0]F5

)

打断点是

%title插图%num

然后我就问高德,*后人家说这不是技术问题,是人家不提供这个功能(我去,早说嘛,害的我还以为配置有问题,重新搞了好几次)。

所以就不要纠结了。安卓的可以试试,看看行不行。

mac上终端命令行下载东西

首先cd到要下载的文件夹目录下,比如我要下载一个mp4文件,在终端键入

curl -o card.mp4 http://lw1089-hc34.aipai.com/user/596/17601596/1006/card/44113620/card.mp4?to=aipai

%title插图%num

iOS transform的简单使用

一、 transform 属性
在OC中,通过 transform 属性可以修改对象的平移、缩放比例和旋转角度。

1)创建“基于控件初始位置”的形变

CGAffineTransformMakeRotation ——旋转

CGAffineTransformMakeTranslation ——平移

CGAffineTransformMakeScale ——缩放

2)创建“基于 transform 参数”的形变

CGAffineTransformTranslate

CGAffineTransformScale

CGAffineTransformRotate

补充:在OC中,所有跟角度相关的数值,都为弧度制 180度 = M_PI , 45度 = M_PI_4 。

正数表示顺时针旋转,负数表示逆时针旋转。

“基于 transform 参数”的形变可以基于控件上一次的状态进行叠加形变,如先旋转再平移。

二、示例
用代码在 viewDidLoad 中添加控制旋转的按钮:

1     //向左旋转按钮
2     UIButton *leftrotatebtn = [UIButton buttonWithType:UIButtonTypeCustom];
3     leftrotatebtn.frame = CGRectMake(125, 450, 80, 40);
4     [leftrotatebtn setTitle:@”向左旋转” forState:UIControlStateNormal];
5    [leftrotatebtn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
6     [leftrotatebtn setTag:1];
7    [self.view addSubview:leftrotatebtn];
8     //添加按钮的单击事件
9    [leftrotatebtn addTarget:self action:@selector(rotate:) forControlEvents:UIControlEventTouchUpInside];
10
11     //向右旋转按钮
12     UIButton *rightrotatebtn = [UIButton buttonWithType:UIButtonTypeCustom];
13     rightrotatebtn.frame = CGRectMake(125, 500, 80, 40);
14     [rightrotatebtn setTitle:@”向右旋转” forState:UIControlStateNormal];
15    [rightrotatebtn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
16     [rightrotatebtn setTag:0];
17    [self.view addSubview:rightrotatebtn];
18     //添加按钮的单击事件
19     [rightrotatebtn addTarget:self action:@selector(rotate:) forControlEvents:UIControlEventTouchUpInside];

viewDidLoad 是视图加载完成后调用的方法,通常在此方法中执行视图控制器的初始化工作。

添加旋转按钮响应事件:

1 – (void)rotate:(id)sender{
2     UIButton *button = (UIButton *)sender;
3     if (button.tag) {
4         //self.headImageView.transform = CGAffineTransformMakeRotation(-M_PI_4);
5         //逆时针旋转
6         self.headImageView.transform = CGAffineTransformRotate(self.headImageView.transform, -M_1_PI);
7     } else {
8         //顺时针旋转
9         self.headImageView.transform = CGAffineTransformRotate(self.headImageView.transform, M_PI_4);
10    }
11 }

iOS兼容问题-transform

iOS兼容问题-transform

*近在弄一个bug,公司在弄一个阅读器的软件,在阅读页点击下面的导航目录时,目录能够从左至右的方向缓慢出来,用的

%title插图%num%title插图%num

transform: translate(255px, 0px) translateZ(0px);  //目录出现

transform: translate(0px, 0px) translateZ(0px);    //目录隐藏

来进行目录的显示和隐藏。在安卓手机能够自由切换,并且页面正常但是在苹果手机上就不行。在苹果手机上进行阅读是点击目录然后在进入阅读页,屏幕向右侧滑动会出现白色空白且大小目录一致,然后我就觉得是目录影响了阅读页,开始我认为是因为position定位的问题,原本是position:relative;后来我改成了absolute;空白是没有了;但是引出了一系列的原本没有的bug!!!

所以这个解决方法不行。方寸大乱…..

后来实在没办法了,我就改掉了$Woread.transUtil(“.rb_all, .raad_box_ml”, 0);这样的切换写法也就是上方的transform改成了

//目录出现,阅读页的左边left定位到目录的右侧位置

$(“.raad_box_ml”).css(“left”,”0px”);
$(“.rb_all”).css(“left”,”255px”);

%title插图%num%title插图%num

 

//目录隐藏,阅读页的左边left定位到屏幕左边缘

$(“.raad_box_ml”).css(“left”,”-255px”);  //.raad_box_ml目录的class,255px也为目录的宽度
$(“.rb_all”).css(“left”,”0px”);   //.rb_all为整个阅读页(不包括目录)的class

这样写 IOS和Android都能兼容了。

这个问题困扰了我3天左右,我觉得的是transform在IOS下有点不兼容。也许是我想错了,有知道的大神可以指出,虚心接受~~~

ios layer 动画-(transform.scale篇)

x轴缩放:
CABasicAnimation *theAnimation;
theAnimation=[CABasicAnimation animationWithKeyPath:@”transform.scale.x”];
theAnimation.duration=8;
theAnimation.removedOnCompletion = YES;
theAnimation.fromValue = [NSNumber numberWithFloat:1];
theAnimation.toValue = [NSNumber numberWithFloat:0.5];
[yourView.layer addAnimation:theAnimation forKey:@”animateTransform”];

y轴缩放:
CABasicAnimation *theAnimation;
theAnimation=[CABasicAnimation animationWithKeyPath:@”transform.scale.y”];
theAnimation.duration=8;
theAnimation.removedOnCompletion = YES;
theAnimation.fromValue = [NSNumber numberWithFloat:1];
theAnimation.toValue = [NSNumber numberWithFloat:0.5];
[yourView.layer addAnimation:theAnimation forKey:@”animateTransform”];

x轴,y轴同时按比例缩放:
CABasicAnimation *theAnimation;
theAnimation=[CABasicAnimation animationWithKeyPath:@”transform.scale”];
theAnimation.duration=8;
theAnimation.removedOnCompletion = YES;
theAnimation.fromValue = [NSNumber numberWithFloat:1];
theAnimation.toValue = [NSNumber numberWithFloat:0.5];
[yourView.layer addAnimation:theAnimation forKey:@”animateTransform”];

以上缩放是以view的中心点为中心缩放的,如果需要自定义缩放点,可以设置卯点:
//中心点
[yourView.layer setAnchorPoint:CGPointMake(0.5, 0.5)];

//左上角
[yourView.layer setAnchorPoint:CGPointMake(0, 0)];

//右下角
[yourView.layer setAnchorPoint:CGPointMake(1, 1)];

iOS transform(平移、旋转、缩放)

1.CGAffineTransformMakeTranslation每次都是以*初位置的中心点为起始参照

CGAffineTransformTranslate每次都是以传入的transform为起始参照

CGAffineTransformIdentity为*初状态,即*初位置的中心点

一、平移

//平移
[UIView animateWithDuration:0.5 animations:^{
//使用Make,它是相对于*原始的位置做的形变.
//self.imageV.transform = CGAffineTransformMakeTranslation(0, -100);
//相对于上一次做形变.
self.imageV.transform = CGAffineTransformTranslate(self.imageV.transform, 0, -100);
}];

二、旋转

[UIView animateWithDuration:0.5 animations:^{

//旋转(旋转的度数, 是一个弧度)
//self.imageV.transform = CGAffineTransformMakeRotation(M_PI_4);

self.imageV.transform = CGAffineTransformRotate(self.imageV.transform, M_PI_4);

}];

三、缩放

[UIView animateWithDuration:0.5 animations:^{
//缩放
//self.imageV.transform = CGAffineTransformMakeScale(0.5, 0.5);
self.imageV.transform = CGAffineTransformScale(self.imageV.transform, 0.8, 0.8);
}];

苹果开发者账号续费详细步骤(2017年7月以后)

*新更新:
2019年8月:
提供税号的环节包含在网站的续费步骤中,以下打电话提供税号的内容请自行忽略。


收到了苹果发来的一封邮件,提示开发者账号快要到期了,需要续费。
内容如下:

%title插图%num

于是去开发者网站https://developer.apple.com/account/看了一下

%title插图%num

上面显示了账号快要到期的提示

点击右上角的Renew Membership按钮

进入了登录界面

%title插图%num

登录以后进入如下界面:

%title插图%num

直接进行第二项选择地区,选择中国以后出现如下界面:

%title插图%num

填写银行卡号、联系人信息和账单地址,点击继续

然后是填写发票信息

在2017年7月以后,开发票需要提供纳税人识别号

由于当时不确定是付款之前提供税号还是付款之后提供

所以咨询了一下苹果的客服

%title插图%num

确定了是付款完成之后再拨打电话提供税号

填写发票信息这一步,注意一定要选择公司抬头的发票,我当时错选了个人抬头的发表,后期又找苹果客服改的,只有一次改正的机会。

填写发票信息和付款时没有来得及截图(因为当时老板在旁边),付款用的是信用卡,不用支付密码就付款成功了。

付款成功以后会出现如下界面:

%title插图%num
%title插图%num

同时绑定AppleID的邮箱会收到如下两封邮件:

%title插图%num
%title插图%num

同时还会收到一封带有发票信息pdf附件的邮件

%title插图%num

接下来是拨打苹果公司的客服电话提供税号

过程比较漫长,建议直接拨打如下电话4006668800-转1-转3-转1-转5(注意一定要要在9点-18点之间拨打,如果太晚拨打苹果公司就下班了)

说一下我拨打电话的过程,首先我拨打了在线客服提供的电话400-666-8800,接通以后客服让我提供个人信息,然后让我拨打电话400-670-1855,接通以后还是先提供个人信息,然后客服问我开发者账号的所有者是不是我本人,是我们老板的,所以让老板本人接听了电话,老板接听电话以后客服又说需要拨打4006668800-转1-转3-转1-转5,所以我又按照他说的拨打了电话,接通以后相继转接了三个客服,才*后报上了我们的税号,客服和我说我填写的不是发票抬头不是公司的是个人的,需要修改,且只有一次修改的机会,经过反复确认,*后终于确定了发票信息。客服说因为我这个发票是经过修改的,所以查不到任何物流信息,发票会在4周之内寄到填写的公司地址所在地(*快2-3周)。客服*后还提醒我*近降温,注意保暖,非常贴心!

至此全部过程已经结束。整个过程花了1个小时左右。

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速