2012年3月24日 星期六

Filter4Cam 實作: 11. 濾鏡表單之四

since: 2012/03/23
update: 2012/04/19

reference: I touchs: Filter4Cam 學習之 Scroll Horizontally Tables: Part 2

客製化 TableViewCell 之一

A. 說明
      1. 使用 Apple 預設的 cell 樣式, 可以有子標題或圖片, 但是無法在其中嵌入一個
          Table View.

      2. 在此將簡化架構, 僅供 iPhone 使用, 也讓將來的維護較為容易.(不考慮 iPad)

      3. 之後將會建立一個 UITableView, 旋轉後加入成為 cellsubview.
          (需要覆寫 initWithFrame 方法)

------------------------------------------------------------------------------------

B. 新增 TableViewCell 子類別
      (可在其中嵌入水平的 filter Table View
)
      1. Xcode > File > New > File...
         > iOS > Cocoa Touch > Objective-C class > Next
        Class: HorizontalTableCell
        Subclass of: UITableViewCell // 自行輸入
        > Next > Create

      2. 開啓 HorizontalTableCell.h 檔案, 修改如下:
#import <UIKit/UIKit.h>
//@add
#import "ConstantDefined.h"

//@interface HorizontalTableCell : UITableViewCell
//@update
@interface HorizontalTableCell : UITableViewCell <UITableViewDelegate, UITableViewDataSource>
{
    //@add
    // we will rotate and add as a subview of our cell
    UITableView *filterTableView;

    // hold the filters for the category we are in
    NSArray *filters;
}

//@add
@property (nonatomic, strong) UITableView *filterTableView;
@property (nonatomic, strong) NSArray *filters;

@end

      3. 開啓 HorizontalTableCell.m 檔案, 修改如下:
#import "HorizontalTableCell.h"

@implementation HorizontalTableCell

//@add
@synthesize filterTableView = _filterTableView;
@synthesize filters = _filters;

#pragma mark - Table View Data Source

//@add
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{  
    return [self.filters count];
}

//@add
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"FilterCell";
   
    // we create a standard UITableViewCell for now
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
   
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }
   
    cell.textLabel.text = @"The title of the cell in the table within the table :O";
   
    return cell;
}

//@update: comment it
/*
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
    }
    return self;
}
*/

//@update: comment it
/*
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}
*/

#pragma mark - Memory Management

//@add
- (void)dealloc
{
    self.filterTableView = nil;
    self.filters = nil;
}

@end 

------------------------------------------------------------------------------------

C. 定義用來客製化介面(大小, 顏色)的常數
     開啓 ConstantDefined.h 檔案, 修改如下:

#ifndef Filter4Cam_ConstantDefined_h
#define Filter4Cam_ConstantDefined_h

//@add
#define kHeadlineSectionHeight  26
#define kRegularSectionHeight   18


////////////////////////////////////////////////////////////////////
//@add: 將 Table View 旋轉成水平向之相關設定值
//
// 嵌在一個 table view row 裡的 table view 之寬度(或旋轉前的 table 長度)
// 在此設為 iPhone 預設的寬度 320 來填滿整個螢幕.

#define kTableLength                                320


////////////////////////////////////////////////////////////////////
// 在水平向的 Table 裡, 我們不想要預設的 UITableView cells 大小.
// 原因有二: 1. 因為我們要作成正方形的.
//                    2. 即使你的 table 可能是 100 pixels 寬, 但是 cells 將會大於這個值,
//                        浪費了記憶體與資源來畫看不到的東西.   
//
// 嵌入的 table view 之 cell 的寬度(旋轉之後, 會是 row 的高度)
#define kCellWidth                                  106

// 嵌入的 table view 之 cell 的高度(旋轉之後, 會是 row 的寬度)
#define kCellHeight                                 106


//@add: 2012/03/25
////////////////////////////////////////////////////////////////////
// overlay 在最底層 camera 上的原始 table
//
// 設定其 Row 的高度與嵌入的 table 之 cell 的 高度/寬度(正方形) 相同
// 如此 cell 才會完整的位於可捲動的區域內.
#define kOverlayTableViewRowHeight                  106


////////////////////////////////////////////////////////////////////
// 為了在水平向的 Table 裡建立稍微小一點的 cell, 我們讓每個 filter 的圖片和標題
// 之間有一些間隔.
//
// 為 cell(filter) 的圖片和標題填上空白
#define kFilterCellVerticalInnerPadding            3
#define kFilterCellHorizontalInnerPadding          3


////////////////////////////////////////////////////////////////////
// 讓標題的可讀性提高
// 藉由設定 cell 左右二邊的空白 pixels 數量, 來明確區別 UILabel 中不同 filter 的 title
//
// 為 filter cell 的標題 Label 填上空白
#define kFilterTitleLabelPadding                   4


////////////////////////////////////////////////////////////////////
// 水平 Table View 裡的空白 pixels 數量
//
// 在 row 裡嵌入的 table view 之垂直方向空白 pixels 數量
#define kRowVerticalPadding                         0

// 在 row 裡嵌入的 table view 之水平方向空白 pixels 數量
#define kRowHorizontalPadding                       0


////////////////////////////////////////////////////////////////////
// 分別為垂直方向與水平方向的 table view 設定背景顏色
// 當使用者在 scroll 可用的 row, 或當 app 載入時; 才可以看到類似的背景顏色
// (而非全白)

//
// 垂直方向 table view 的背景顏色
#define kVerticalTableBackgroundColor               [UIColor colorWithRed:0.58823529 green:0.58823529 blue:0.58823529 alpha:1.0]

// 水平方向 table view 的背景顏色(即嵌在垂直 table rows 裡的)
#define kHorizontalTableBackgroundColor             [UIColor colorWithRed:0.6745098 green:0.6745098 blue:0.6745098 alpha:1.0]

// 將 Table (最下方)的分隔線設為: 不透明灰 (update: 2012/04/19)
#define kVerticalTableSeparatorColor             [UIColor colorWithRed:0.48235294 green:0.48235294 blue:0.48235294 alpha:1.0]


////////////////////////////////////////////////////////////////////
// 當使用者選擇特定的 filter 時, cell 會出現的背景顏色.
// 一般的預設是藍色的, 這樣會破壞整體的設計
//
// 當使用者選擇特定的 filter 時, 水平方向 table view 的背景顏色
// (點選 Filter 時, 圖例的外框顏色)

#define kHorizontalTableSelectedBackgroundColor     [UIColor colorWithRed:0.0 green:0.59607843 blue:0.37254902 alpha:1.0]


//@add: 2012/03/25
////////////////////////////////////////////////////////////////////
// Filter Cell 標題標籤的背景顏色
//
#define kFilterCellTitleLabelBackgroundColor     [UIColor colorWithRed:0.0 green:0.476 blue:0.0 alpha:0.7]

#endif

------------------------------------------------------------------------------------

D. 開啓 HorizontalTableCell.m 檔案, 修改如下:
....
//@add
- (NSString *)reuseIdentifier
{
    return @"HorizontalCell";
}

//@add
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        //@add
        // we are creating our table horizontally
        self.filterTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, kCellHeight, kTableLength)];
       
        // turn off the vertical and horizontal scroll indicators
        self.filterTableView.showsVerticalScrollIndicator = NO;
        self.filterTableView.showsHorizontalScrollIndicator = NO;
       
        // making a call to Core Graphic’s API in order to
        // rotate our view 90 degrees counter clockwise.(逆時針90度)
        // iOS 乘法運算效能優於除法
        self.filterTableView.transform = CGAffineTransformMakeRotation(-M_PI * 0.5);
       
        // set the table view's frame again
        // since we now rotated it we must reset the values of the table
        [self.filterTableView setFrame:CGRectMake(kRowHorizontalPadding * 0.5, kRowVerticalPadding * 0.5, kTableLength - kRowHorizontalPadding, kCellHeight)];
       
        self.filterTableView.rowHeight = kCellWidth;
        self.filterTableView.backgroundColor = kHorizontalTableBackgroundColor;
       
        self.filterTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
        self.filterTableView.separatorColor = [UIColor clearColor];
       
        // set ourselves as the table's data source and delegate
        self.filterTableView.dataSource = self;
        self.filterTableView.delegate = self;
       
        [self addSubview:self.filterTableView];
    }
   
    return self;
}
....

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。