作者聲明
因個人能力問題,文中不免會有錯誤之處,歡迎各位讀者交流,批評,指正!
摘要
本文通過一個實例學習按鈕的基本操作:爲一個button設置一個背景圖片,另外設置八個按鈕,分別控制該button的空間平移和縮放、旋轉變換。
用到的按鈕屬性總結
- frame
1.1 表示控件的位置和尺寸(以父控件的左上角爲左邊遠點(0,0))。
1.2 修改這個屬性,可以調整控件的位置和尺寸。 - center
2.1 表示控件的中點(以父控件的左上角爲座標原點)。
2.2 修改這個屬性,只能調整控件的尺寸。 - bounds
3.1 表示控件的位置和尺寸(以自己的左上角爲座標原點,位置永遠是(0.0))
3.2 修改這個屬性,只能調整控件的尺寸。 - tag
4.1 表示控件的標識符.
4.2 通過不同的標識符可以區分不同的控件。 - transform
5.1 表示控件的形變狀態,常用的有旋轉角度,縮放比例)
5.2 修改方法包括絕對修改和相對修改。
實例
以下爲實例:
Main.stroryboard
(待完善)
viewController.h 文件代碼
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
// 定義成員but。
@property (weak, nonatomic) IBOutlet UIButton *but;
// 聲明移動方法。
- (IBAction)move:(id)sender;
// 聲明縮放方法。
- (IBAction)scale:(id)sender;
// 聲明旋轉方法。
- (IBAction)rotate:(id)sender;
@end
viewController.m文件代碼
//
// ViewController.m
// 按鈕操作練習
//
// Created by dqw on 15/5/5.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#import "ViewController.h"
// 方便更改。
#define kDelta 100
// 這個是類的延展,可以添加成員變量和方法。
@interface ViewController ()
@end
@implementation ViewController
#pragma mark 加載
#pragma mark 定義block 實現代碼重構
// 此處要注意block定義的時候的類型,該方法沒有聲明,只有實現,應該是私有方法(不確定)。關於私有方法:此處的私有方法可能是指只能在本.m文件中使用的方法。
- (void)butClickWithBlock:(void(^)())block{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
// 調用的時候要帶括號的。
block();
[UIView commitAnimations];
}
#pragma mark 上下左右移動
- (IBAction)move:(id)sender
{
/*
// 這是當前viewcontroller的一個方法,所以要用self來調用它,不僅僅是代碼替換,而是方法調用。
[self butClickWithBlock:^{
// 不能直接對對象(viewcontroller-view-_but)的結構題(frame-origin)裏的成員(y 或者x)直接賦值,所以要先講結構體取出,修改其成員值,然後再將其賦值給對象的結構體。
CGRect frame = _but.frame;
// sender.tag也可。
int tag = [sender tag];
switch (tag)
{
case 1:
frame.origin.y -= kDelta;
break;
case 2:
frame.origin.x -= kDelta;
break;
case 3:
frame.origin.y += kDelta;
break;
case 4:
frame.origin.x += kDelta;
break;
default:
break;
}
_but.frame = frame;
}];
*/
#pragma mark 通過center來移動按鈕。
// 通過center來移動按鈕
[self butClickWithBlock:^{
// 不能直接對對象(viewcontroller-view-_but)的結構體(center)裏的成員(y 或者x)直接賦值,所以要先將結構體取出,修改其成員值,然後再將其賦值給對象的結構體。
// 需要注意center是CGPoint類型。
CGPoint center = _but.center;
// sender.tag也可。
int tag = [sender tag];
switch (tag)
{
case 1:
center.y -= kDelta;
break;
case 2:
center.x -= kDelta;
break;
case 3:
center.y += kDelta;
break;
case 4:
center.x += kDelta;
break;
default:
break;
}
_but.center = center;
}];
}
#pragma mark 縮放。
- (IBAction)scale:(id)sender {
[self butClickWithBlock:^{
// 三目運算的優先級高於賦值運算,注意這些值的類型CGfloat。
CGFloat scalexy = [sender tag] == 5 ? 1.2 : 0.8;
// CGAffineTransformMakeScale(<#CGFloat sx#>, <#CGFloat sy#>),這個函數是絕對縮放,下面的是相對縮放。
_but.transform = CGAffineTransformScale(_but.transform, scalexy, scalexy);
}];
}
#pragma mark 旋轉。
- (IBAction)rotate:(id)sender {
[self butClickWithBlock:^{
CGFloat angel = [sender tag] == 7 ? -M_PI_4 : M_PI_4;
_but.transform = CGAffineTransformRotate(_but.transform, angel);
}]; // 注意此結束符號。
}
// 讓按鈕恢復到初始狀態。
- (IBAction)reset:(UIButton *)sender {
[self butClickWithBlock:^{
// 下面的xxident爲一個矩陣常量,對角矩陣。
self.but.transform = CGAffineTransformIdentity;
}];
}
@end
重點 難點 注意點
- 利用block提取共同的代碼。
- 所以的方法都是viewController的類方法或者對象方法。
- 不能給對象的結構體中的成員直接賦值。
- tag center的使用
- transform裏面的絕對變換和相對變換。
- 將按鈕恢復到初始化狀態,CGAffineTransformIdentity爲一個常量,the identity transform :恆等變換,其值爲單位對角矩陣:[ 1 0 0]
[ 0 1 0]
[ 0 0 1 ]
待完善的內容
- 瞭解更多的屬性和方法