股票场内基金交易,没时间盯盘?

   
使用优财助手电脑客户端记录下您的股票买入卖出数据,能帮您时刻盯盘,会根据您记录的未售出买入价计算上涨或下跌幅度,及时弹框通知您。想知道如何使用?快点击左方视频观看了解吧~~下载地址:http://youcaizhushou.com

本文通过一个简单的程序来演示 UIButton 对象的视图属性的配置使用和修改。分别建立 7 个 UIButton 对象,实现 UIButton 对象的放大、缩小、移动、高亮时变换背景图片和文字格式的效果。如果所示:

演示3

本文工程文件及素材文件

wakemeup-xyz/UIButton-practice-view @ GitHub

添加 app 所需图片素材

首先在 xcode 新建一个 Single View Application。在 main.storyboard 按照按钮的大致位置建立 9 个新的 UIButton 对象。

Xcode 中的左侧 Navigator 栏中有一个 Asset.xcassets(在某些 Xcode低版本中为 Images.xcassets)文件夹用图放置 app 所需要的图片素材。将『箭头』文件夹直接拖入 Asset.xcassets,在以后空间中需要使用图片时直接输入文件名就可以了。拖入后 Asset.xcassets 即会显示图片例表,如图所示:

Snip20160325_1

设置背景图片

先将 UIButton 空间都拖拽(或者调整 View-Width/Height)到合适的大小。设置背景图片的方法为:选定当前 按钮控件,在右侧的 Attributes Inspecter 菜单中的 background 下拉菜单选择合适的图片名,(例如btn01,topnormal,leftnormal,rightnormal 等等)。并设置相应的 Title 属性(控件显示的文字),如图所示:

Snip20160325_3

设置 HighLight 效果

在按钮按下时即进入高亮(HighLight)状态,我们需要对高亮状态进行设置以产生动画效果。选定背景为海贼王的 UIButton。它的 type 属性定义了这个 UIButton 的种类,包括了六种选项,分别为:

  • Custom: 自定义风格(无边框的那种)
  • System: 系统默认风格
  • DetailDisclosure: 蓝色小箭头按钮,主要做详细说明用(iOS7 上变成一个亮的蓝色感叹号)
  • InfoLight: 亮色感叹号
  • InfoDark: 暗色感叹号
  • ContactAdd: 十字加号按钮

Custom 与 System 的区别在于:System 在按下高亮时整个按钮都会变成灰白色,但是 Custom 则是根据用户自定义的效果变化。可以都尝试一遍看一看效果变化。由于这个 UIButton 我们需要自定义按下高亮时的变化,因此需要选择为 Custom(自定义).

State Config 属性代表着这一系列属性在 UIButton 的不同状态下的定义。

分别有以下几种状态:

  • Default : 常规状态显现;
  • Highlighted : 高亮状态(即为按钮被按下时的状态)显现;
  • Selected : 选中状态;
  • Focused : 获得焦点状态(iOS 9.0 及以后)
  • Disabled : 禁用的状态才会显现.

每种状态下的文字内容、颜色、字体、背景图片等等属性都是各自独立的。这次在Default 状态下设置字体颜色 Text Color 为红色。在 Highlighted 状态下设置字体颜色为蓝色,background 为 btn_02。

同理,把其他按钮也需要将 Type 改为 Custom,Highlighted 状态的 background 改为相应的 *highlighted。

IBAction 与 IBOutlet 连线

有一个思路是建立 moveLeft、moveRight、moveUp、moveDown、zoomIn、zoomOut、rotateLeft、rotateRight 这样 8 个监听事件响应各种动作,但是由于这些动作的代码内容差异很小,会导致代码比较麻烦出现很多重复的内容,不推荐采用。

更好的解决方法是建立一个名为 move 的监听事件同时连接这四个箭头,再点击不同的箭头时会返回不同的对象参数,于是产生不同的动作,节约许多公共的代码。实现如下:在 ViewController.m(私有方法)中建立 1 个 IBAction 监听事件为 move。并与 4 个箭头拖拽连线建立关系。就像这样:

Snip20160325_6

然后把左、上、右、下四个方向的 UIButton 的 tag 属性分别设置为 100,101,102,103 以进行区分监听事件由哪个按钮触发。

同理对于缩放按钮,需要建立 zoom 事件并连接到加减号

对于旋转按钮,建立 rotate_new 事件并连线

然后还要声明一个属性变量:

连接到演示海贼王的 UIButton,此后这个按钮即用 headImageView 表示。

实现 UIButton 移动

坐标系

首先需要弄清楚控件的坐标的坐标系,在 UIkit 坐标系中,原点位于左上角,x 轴向右延伸,y 轴向下延伸,如图所示:

Snip20160325_4

UIView 常见坐标属性

  • 控件所在矩形框在父控件中的位置和尺寸(以父控件的左上角为坐标原点),可以定义控件的大小和位置。

    @property(nonatomic) CGRect frame;

  • 控件所在矩形框的位置和尺寸(以自己左上角为坐标原点),只可以定义控件的大小。

    @property(nonatomic) CGRect bounds;

  • 控件中的点的位置(以父控件的左上角为坐标原点),可以定义控件的位置。

    @property(nonatomic) CGPoint center;

  • 获得自己的父控件对象
    @property(nonatomic,readonly) UIView *superview;

  • 获得自己的所有子控件对象
    @property(nonatomic,readonly,copy) NSArray *subview;

  • 获得控件的 ID,即 tag
    @property(nonatomic) NSInteger tag;

其中 CGRect 、CGPoint 、GAffineTransform为一种结构体,它的定义如下

  • CGFloat: 浮点值的基本类型
  • CGPoint: 表示一个二维坐标系中的点
  • CGSize: 表示一个矩形的宽度和高度
  • CGRect: 表示一个矩形的位置和大小

OC中修改对象的结构体变量的成员

由上述的格式可以知道,要想移动 headImageView,就需要更改它的 origin 结构体属性的 x,y 变量。但是,由于 OC 中对象的封装性OC 规定不允许直接修改对象的结构体变量的成员,所以需要通过借用一个零时结果体进行修改再赋值过去的方法,步骤如下:

这样 move 事件代码为

但是这里 100、101、102、103 仍然时一个没有意义的数字,为了便于理解,我们可以使用枚举或者是定义常量来替换这个四个数字。

这样 move 方法就可以改为:

实现 UIButton 放缩

放大缩小即是改变 self.headImageView.frame.size.width 或者 height 的值,可以得到代码:

但是这样的放缩是以控件左上角为中心变化的,所以控件的中心再变化,为了让控件的中心维持不动,可以再做对 self.headImageView.frame.origin.x 和 y 做适当的偏移(长宽变化量的一半),代码变为:

另外还有一个方法就是使用之前讲过的 bounds 属性(只改变大小),只需要改变 height 和 width即可:

加入动画效果

使用

第一个参数表示要使用的动画效果的 ID,第二个参数为通过使用代理来设置动画的属性。

此后的代码开始以动画效果表示,直到出现

才结束并提交动画。

以放缩为例,把 zoom 方法的代码修改为

运行的效果如图:

演示

可以看到动画是先以左上角为中心缩放再做平移的,所以动画比较别扭。如果在 beginAnimation 加入代码

表示把动画的时长设置为 3 秒,这样就可以看清动画的过程了:

演示2

同样,移动的动画也可以改为

CGAffineTransform 放射变换矩阵

这个结构体变量可以获得和修改控件的形变属性(可以设置旋转角度、比例缩放、平移)

它的定义为

先讲一讲矩阵变换的原理。为了把二维图形的变化统一在一个坐标系里,引入了齐次坐标的概念,即把一个图形用一个三维矩阵表示,其中第三列总是(0,0,1),用来作为坐标系的标准。所以所有的变化都由前两列完成。以上参数在矩阵中的表示为:

运算原理:原坐标为(X,Y,1),根据矩阵的乘法

  • 当 a=d=1,b=c=0 时,

    [aX + cY + tx,bX + dY + ty,1] = [X + tx,Y + ty,1],表示按照向量(tx,ty)进行平移。

    这也就是函数 CGAffineTransform CGAffineMakeTranslation(CGFloat tx,CGFloat ty) 的计算原理。

  • 当 b=c=tx=ty=0 时,

    [aX + cY + tx,bX + dY + ty,1] = [aX,dY,1],表示坐标乘以(a,d)进行缩放。

    其实这也就是函数
    CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy) 的计算原理。a 对应于 sx,d 对应于 sy。

  • 当 tx=ty=0,a=cos?,b=sin? ,c=-sin?,d=cose

    [aX + cY + tx ,bX + dY + ty,1] = [Xcos? – Ysin? ,Xsin? + Ycos? ,1] ,这时候 ? 就是旋转角度。下面给出数学证明便于理解:

    先用极坐标表示:用X = cos?,Y = sin?. 旋转 ? 后 X’ = cos(?-?),Y’ = sin(?-?),即 X’ = cos?cos?-sin?sin? ==代换X、Y== Xcos? – Ysin? , Y’ = sin?cos? + cos?sin? ==代换X、Y== Xsin? + Ycos? ,所求得的 X’、Y’即为 Xcos? – Ysin? ,Xsin? + Ycos?。

    其实这也就是函数
    CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle) 的计算原理。angle 即 ? 的弧度表示。

    常用的弧度常量有:

利用 CGAffineTransform 实现 UIButton 的平移、放缩、旋转

根据上一节的原理,我们可以使用 CGAffineTransform 来实现 UIButton 的平移、放缩、旋转。先把此前的 move 、 zoom 方法注释掉,并删除相关的连线(一定要做!不然此后点击按钮会触发不存在的事件然后报错)建立新的 movenew 、zoomnew 方法并连线。 然后输入代码实现。
先添加旋转时需要的枚举定义,并把两个按钮的 tag 设置为 100、111。

enum rotate{
rotateleft = 110,
rotate
right = 111
};

但是如果像这样

的话,按钮只有第一次按下才有反应,这是因为,每次形变都是以初始化时为基准的,所以应该引入一个 delta 变量,每次按下时改变 delta 的值。而且,这个 delta 应该是全局变量,这样的话才能在每次调用时不会重置掉 delta 的值

在 ViewController.m 顶部定义

CGFloat deltaAngle = 0;

然后在实现部分添加

- (IBAction)rotate_new:(UIButton *)button
{
if(button.tag == rotate_left)
deltaAngle -= M_1_PI/10;
else
deltaAngle += M_1_PI/10;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
self.headImageView.transform = CGAffineTransformMakeRotation(deltaAngle);
[UIView commitAnimations];
}

然后实现 movenew 、 zoomnew:
同样在顶部添加

实现:

还有一种方法就是 CGAffineTransform 也提供了基于当前位置的形变函数(名字不带 make)因此,这样也可以用于平移、放缩、旋转,实现如下:

就可以实现出如下的效果了。

演示3

UIButton 创建与配置的代码实现

下面来用代码来配置一个 UIButton,作为 headImageView。
视图的初始化应该在 viewDidLoad 方法中,现在来覆写其父类的 viewDidLoad:

然后在 viewDidLoad 方法中创建和配置UIButton:

然后添加 click: 方法

这样的话便可以实现新的按钮的动态点击、移动旋转放缩的功能了.

   

想获得去掉 5 元限制的证券账户吗?

证券交易股票基金的佣金,不足 5 元会按照 5 元收取。比如交易 1000 元的股票,按照普遍的证券佣金手续费率万 2.5,其交易佣金为 0.25 元,小于 5 元,实际会收取佣金 5 元,买卖两次需要支付 10 元佣金成本,1% 的利润就这样没了。

如果您想去掉最低交易佣金 5 元限制,使用微信扫描左边小程序二维码,访问微信小程序「优财助手」,点击底部菜单「福利」,阅读文章「通过优财开证券账户无最低交易佣金 5 元限制」,按照文章步骤操作即可获得免 5 元证券账户,股票基金交易手续费率万 2.5。

请注意,一定要按照文章描述严格操作,如错误开户是无法获得免 5 元证券账户的。
Tagged:

发表评论

电子邮件地址不会被公开。 必填项已用*标注