ISO開發基礎—簡單的圖片瀏覽app

dqw18037發表於2015-05-07

作者宣告

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

摘要

設計一個簡單的圖片瀏覽應用,可實現圖片瀏覽、設定夜間模式、圖片縮放、更改圖片序號和描述、隱藏設定檢視等。

用到的控制元件

button imageView lable slider switch

例項

viewController . h程式碼

//
//  ViewController.h
//  圖片瀏覽器
//
//  Created by dqw on 15/5/6.
//  Copyright (c) 2015年 itcast. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (weak, nonatomic) IBOutlet UILabel *imageNo;

@property (weak, nonatomic) IBOutlet UILabel *imageDesc;

@property (weak, nonatomic) IBOutlet UIView *settingView;

- (IBAction)changImages:(UISlider *)sender;

- (IBAction)setMode:(UISwitch *)sender;

- (IBAction)scaleImage:(UISlider *)sender;

- (IBAction)displaySettingView:(id)sender;


@end

viewController . m程式碼

//
//  ViewController.m
//  圖片瀏覽器
//
//  Created by dqw on 15/5/6.
//  Copyright (c) 2015年 itcast. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

{
// 在此定義成員變數是為了在下面的多個方法能夠使用它。
    NSArray *_imageDescs;
}

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

     // 更改圖片描述,圖片和圖片描述子類都放在一個app包裡面,mianbundle 就是得到這個包。
    NSBundle *bundle = [NSBundle mainBundle];

    // 得到包裡面該檔案的路徑。
    NSString *path = [bundle pathForResource:@"imageDescs" ofType:@"plist"];

    // 將路徑裡面的檔案提取至陣列裡面。
    _imageDescs = [NSArray arrayWithContentsOfFile:path];

     _imageDesc.text = _imageDescs[0];

}

// 定義動畫方法。
- (void)butClickWithBlock:(void(^)())block
{
    [UIView beginAnimations:nil context:nil];

    [UIView setAnimationDuration:1.0];

    block();

    [UIView commitAnimations];
}

// 監聽圖片瀏覽滑鈕,改變圖片,圖片序號,圖片描述。
- (IBAction)changImages:(UISlider *)sender {

    [self butClickWithBlock:^{

        // 更改圖片序號,注意滑鈕的值要改為整數,此處的%.f表達表示四捨五入。
        _imageNo.text = [NSString stringWithFormat:@"%.f/16", sender.value];

        // 得到圖片的序號,int強制型別轉化僅僅提取整數部分,沒有四捨五入,所以為了和上面對應,要+0.5.
        int no = (int)(sender.value + 0.5);

        // 更改圖片。
        NSString *imageName = [NSString stringWithFormat:@"%d.png", no - 1];

        UIImage *image = [UIImage imageNamed:imageName];

        _imageView.image = image;

        // 以此更改圖片描述。
        _imageDesc.text = _imageDescs[no-1];

    }]; 
}

// 監聽夜間模式按鈕。
- (IBAction)setMode:(UISwitch *)sender {

    [self butClickWithBlock:^{
        if (sender.on){

        // 用這種方法編譯失敗,原因不清楚,好像_view這個表達不合理。可能是因為_view是當前viewController類的父類UIviewController的成員變數,其定義為@Package。
       // _view.backgroundColor = [UIColor darkGrayColor];

        self.view.backgroundColor = [UIColor darkGrayColor];

        // 下面的表達也是可以的,背景色是設定為灰色,而不是黑色。
        //[self.view setBackgroundColor:[UIColor darkGrayColor]];
        }
        else
        {
            [self.view setBackgroundColor:[UIColor whiteColor]];
        }
    }];
}

// 監聽縮放圖片滑鈕。
- (IBAction)scaleImage:(UISlider *)sender {

    [self butClickWithBlock:^{

        float scaleXY = sender.value;

    // 該方法錯誤,它是相對縮放,在當前的基礎上縮放,變換不均勻,當圖片縮小到零的時候,圖片會消失,無法恢復。
    //_imageView.transform =  CGAffineTransformScale(_imageView.transform, scaleXY, scaleXY);

    //該方法是絕對縮放,推薦使用。
    _imageView.transform = CGAffineTransformMakeScale(scaleXY, scaleXY);

    // 與上面的方法相似,得到其最初狀態,然後進行型對縮放。
    //_imageView.transform = CGAffineTransformScale(CGAffineTransformIdentity, scaleXY, scaleXY);

    }];

}

// 監聽隱藏設定檢視按鈕。
- (IBAction)displaySettingView:(id)sender {

    [self butClickWithBlock:^{

        CGRect frame = _settingView.frame;

    if (_settingView.frame.origin.y < self.view.frame.size.height) {

        // 注意加減的是settingview的高度。
        frame.origin.y += _settingView.frame.size.height;

    }
    else{
        frame.origin.y -= _settingView.frame.size.height;

    }
    _settingView.frame = frame;

    }];

}
@end

重點 難點 注意點

  1. 得到plist檔案中圖片描述的方法: support檔案放在一個.app檔案裡面,稱為一個包(bundle),利用類方法 NSBundle *bundle = [NSBundle mainBundle]得到該包,然後呼叫物件方法NSString *path = [bundle pathForResource:@”imageDescs” ofType:@”plist”];得到其路徑,最後通過路徑將其中的內容提取到陣列中。
  2. 直接使用_view得到當前viewController的_view變數好像是不合理的表達。個人猜測可能是因為:_view是當前viewController類的父類UIviewController的成員變數,其定義為@Package。
  3. 將plist裡面的內容提取到陣列中的操作是放在- (void)viewDidLoad方法裡面。
  4. %.f和(int)的區別,前者四捨五入,後者僅僅擷取整數部分,所以為了保證二者一致,則int方法裡面將原值+0.5.
  5. 在通過比例因子對圖片進行縮放的時候,要注意使用絕對縮放。
  6. 如果要改變某個控制元件,則將其定義為成員變數,如果要監聽其動作,則對其定義觸發事件。

待完善的內容

  1. @package 修飾的成員變數,其作用域,許可權怎樣。
  2. @private 所謂的私有,究竟是怎麼一回事,結合方法的私有。
  3. 深入研究plist使用方法,看看還可以實現其它功能。

相關文章