IOS開發基礎—按鈕(button)基本操作

作者聲明

因個人能力問題,文中不免會有錯誤之處,歡迎各位讀者交流,批評,指正!

摘要

本文通過一個實例學習按鈕的基本操作:爲一個button設置一個背景圖片,另外設置八個按鈕,分別控制該button的空間平移和縮放、旋轉變換。

用到的按鈕屬性總結

  1. frame
    1.1 表示控件的位置和尺寸(以父控件的左上角爲左邊遠點(0,0))。
    1.2 修改這個屬性,可以調整控件的位置和尺寸。
  2. center
    2.1 表示控件的中點(以父控件的左上角爲座標原點)。
    2.2 修改這個屬性,只能調整控件的尺寸。
  3. bounds
    3.1 表示控件的位置和尺寸(以自己的左上角爲座標原點,位置永遠是(0.0))
    3.2 修改這個屬性,只能調整控件的尺寸。
  4. tag
    4.1 表示控件的標識符.
    4.2 通過不同的標識符可以區分不同的控件。
  5. 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

重點 難點 注意點

  1. 利用block提取共同的代碼。
  2. 所以的方法都是viewController的類方法或者對象方法。
  3. 不能給對象的結構體中的成員直接賦值。
  4. tag center的使用
  5. transform裏面的絕對變換和相對變換。
  6. 將按鈕恢復到初始化狀態,CGAffineTransformIdentity爲一個常量,the identity transform :恆等變換,其值爲單位對角矩陣:[ 1 0 0]
    [ 0 1 0]
    [ 0 0 1 ]

待完善的內容

  1. 瞭解更多的屬性和方法
發佈了27 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章