#import "WTAlbumImVC.h"
#import "WTPullRefreshView.h"
#import "WTAlbumPicListCell.h"
#import "WTPictureDetailVC.h"
@interface WTAlbumImVC () <WTPullRefreshViewDelegate, WTPictureDetailVCDelegate>
// picture list view
@property (retain, nonatomic) IBOutlet UIView *picListView;
@property (retain, nonatomic) IBOutlet UITableView *picTableView;
@property (retain, nonatomic) WTPullRefreshView *picPullRefreshView;
// im view
@property (retain, nonatomic) IBOutlet UIView *imView;
// picture list view data source
@property (retain, nonatomic) NSMutableArray *picArray;
@property (assign, nonatomic) BOOL picHasMore;
@property (retain, nonatomic) NSString *picCursor;
// im view data source
@end
@implementation WTAlbumImVC
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (UIBarButtonItem*)createBackBarButton
{
//定制自己的风格的 UIBarButtonItem
UIImage* image= [UIImage imageNamed:@"back.png"];
UIImage* imagef = [UIImage imageNamed:@"back_focus.png"];
CGRect backframe= CGRectMake(0, 0, image.size.width, image.size.height);
UIButton* backButton= [UIButton buttonWithType:UIButtonTypeCustom];
backButton.frame = backframe;
[backButton setBackgroundImage:image forState:UIControlStateNormal];
[backButton setBackgroundImage:imagef forState:UIControlStateHighlighted];
[backButton addTarget:self action:@selector(onBackButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem* someBarButtonItem= [[[UIBarButtonItem alloc] initWithCustomView:backButton] autorelease];
return someBarButtonItem;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.navigationItem.title = _album.albumName;
UIViewController *rootVC = [self.navigationController.viewControllers objectAtIndex:0];
if (rootVC == self || _dismissWhenExit) {
self.navigationItem.leftBarButtonItem = [self createBackBarButton];
}
self.picPullRefreshView = [[[WTPullRefreshView alloc] initWithTableView:_picTableView refreshOn:YES loadMoreOn:NO] autorelease];
_picPullRefreshView.delegate = self;
if (!self.picArray) {
// first time load
self.picArray = [NSMutableArray arrayWithCapacity:100];
[_picPullRefreshView triggerPullRefresh];
}
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)dealloc {
[TMRequest cancelRequestsWithDelegate:self];
self.picListView = nil;
self.picTableView = nil;
self.picPullRefreshView = nil;
self.imView = nil;
self.picArray = nil;
self.picCursor = nil;
[super dealloc];
}
- (void)viewDidUnload {
self.picListView = nil;
self.picTableView = nil;
self.picPullRefreshView = nil;
self.imView = nil;
[super viewDidUnload];
}
#pragma mark - User Click Methods
- (void)onBackButtonClicked:(id)sender {
[self dismissModalViewControllerAnimated:YES];
}
- (void)onPictureClicked:(WTPicture *)aPicture {
WTPictureDetailVC *detailVC = [[[WTPictureDetailVC alloc] init] autorelease];
NSUInteger index = [_picArray indexOfObject:aPicture];
detailVC.hidesBottomBarWhenPushed = YES;
[detailVC setDisplayIndex:index inPictureArray:_picArray hasMore:_picHasMore cursor:_picCursor delegate:self];
[self.navigationController pushViewController:detailVC animated:YES];
}
#pragma mark - Network Methods
- (void)getPictureListSuccess:(TMRequest *)aRequest{
BOOL refresh = (aRequest.tag==1);
if (refresh) {
[_picArray removeAllObjects];
}
TMCursorArray *cursorArray = aRequest.result;
if (cursorArray.array) {
[_picArray addObjectsFromArray:cursorArray.array];
}
self.picHasMore = cursorArray.hasMore;
self.picCursor = cursorArray.cursor;
_picPullRefreshView.needLoadMoreData = cursorArray.hasMore;
[_picTableView reloadData];
[_picPullRefreshView didFinishLoadingSuccess:YES];
}
- (void)getPictureListFail:(TMRequest *)aRequest{
[_picPullRefreshView didFinishLoadingSuccess:NO];
}
- (void)getPictureListFromServerByRefresh:(BOOL)aRefresh {
TMRequest *request = [[WTAlbumService sharedInstance] getPictureListByAlbumId:_album.albumId cursor:aRefresh?nil:_picCursor];
[request setDelegate:self successSel:@selector(getPictureListSuccess:) failSel:@selector(getPictureListFail:)];
if (aRefresh) {
request.tag = 1;
}
[request runAsync];
}
#pragma mark - WTPictureDetailVC Delegate Methods
- (void)pictureDetailVC:(WTPictureDetailVC *)aVC
exitAtPicture:(WTPicture *)aPicture
inPictureArray:(NSArray *)anArray
hasMore:(BOOL)aHasMore
cursor:(NSString *)aCursor
{
if ([_picPullRefreshView isLoading]) {
// 正在加载或者刷新的话,取消请求,避免数据异常
[TMRequest cancelRequestsWithDelegate:self];
[_picPullRefreshView didFinishLoadingSuccess:NO];
}
if ([_picArray count] < [anArray count]) {
// more data loaded
[_picArray removeAllObjects];
[_picArray addObjectsFromArray:anArray];
self.picHasMore = aHasMore;
self.picCursor = aCursor;
_picPullRefreshView.needLoadMoreData = self.picHasMore;
[_picTableView reloadData];
}
int position = NSNotFound;
for (int i=0; i<[_picArray count]; i++) {
WTPicture *temp = [_picArray objectAtIndex:i];
if ([temp.picId isEqualToString:aPicture.picId]) {
position = i;
break;
}
}
if (position != NSNotFound) {
int picCount = position + 1;
int rowCount = picCount / 3;
int mod = picCount % 3;
if (mod > 0) {
rowCount++;
}
int rowIndex = rowCount-1;
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:rowIndex inSection:0];
[_picTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
}
}
- (TMRequest *)pictureDetailVC:(WTPictureDetailVC *)aVC requestForLoadMoreWithCursor:(NSString *)aCursor {
return [[WTAlbumService sharedInstance] getPictureListByAlbumId:_album.albumId cursor:aCursor];
}
- (void)pictureDetailVC:(WTPictureDetailVC *)aVC didPictureDisplayed:(WTPicture *)aPicture {
NSUInteger count = [self.picArray indexOfObject:aPicture]+1; // 加1是因为计算在第几行的时候,是按照个数来算的
int rowCount = count / 3;
int mod = count % 3;
if (mod > 0) {
rowCount++;
}
int rowIndex = rowCount-1;
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:rowIndex inSection:0];
[_picTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
}
#pragma mark - UITableView Delegate Methods
//指定每个分区中有多少行,默认为1
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
int row = [_picArray count] / 3;
int mod = [_picArray count] % 3;
if (mod > 0) {
row ++;
}
return row;
}
-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 105;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"WTAlbumPicListCell";
WTAlbumPicListCell *cell = (WTAlbumPicListCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if(cell == nil){
NSArray *nib = [[NSBundle mainBundle]loadNibNamed:@"WTAlbumPicListCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
int index1 = indexPath.row * 3;
int index2 = indexPath.row * 3 + 1;
int index3 = indexPath.row * 3 + 2;
WTPicture *pic1 = [_picArray objectAtIndex:index1];
WTPicture *pic2 = nil;
if (index2 < [_picArray count]) {
pic2 = [_picArray objectAtIndex:index2];
}
WTPicture *pic3 = nil;
if (index3 < [_picArray count]) {
pic3 = [_picArray objectAtIndex:index3];
}
[cell setPic1:pic1 pic2:pic2 pic3:pic3];
cell.delegate = self;
return cell;
}
#pragma mark -
#pragma mark WTPullRefreshViewDelegate UIScrollViewDelegate Methods
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
if (scrollView == _picTableView) {
[_picPullRefreshView scrollViewDidScroll:scrollView];
}
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
if (scrollView == _picTableView) {
[_picPullRefreshView scrollViewDidEndDragging:scrollView];
}
}
#pragma mark WTPullRefreshViewDelegate Methods
- (void)pullRefreshViewDidTriggerRefresh:(WTPullRefreshView *)aPullFreshView {
if (aPullFreshView == _picPullRefreshView) {
[self getPictureListFromServerByRefresh:YES];
}
}
- (void)pullRefreshViewDidTriggerLoadMore:(WTPullRefreshView *)aPullFreshView {
if (aPullFreshView == _picPullRefreshView) {
[self getPictureListFromServerByRefresh:NO];
}
}
@end
#import "WTPullRefreshView.h"
#import "WTAlbumPicListCell.h"
#import "WTPictureDetailVC.h"
@interface WTAlbumImVC () <WTPullRefreshViewDelegate, WTPictureDetailVCDelegate>
// picture list view
@property (retain, nonatomic) IBOutlet UIView *picListView;
@property (retain, nonatomic) IBOutlet UITableView *picTableView;
@property (retain, nonatomic) WTPullRefreshView *picPullRefreshView;
// im view
@property (retain, nonatomic) IBOutlet UIView *imView;
// picture list view data source
@property (retain, nonatomic) NSMutableArray *picArray;
@property (assign, nonatomic) BOOL picHasMore;
@property (retain, nonatomic) NSString *picCursor;
// im view data source
@end
@implementation WTAlbumImVC
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (UIBarButtonItem*)createBackBarButton
{
//定制自己的风格的 UIBarButtonItem
UIImage* image= [UIImage imageNamed:@"back.png"];
UIImage* imagef = [UIImage imageNamed:@"back_focus.png"];
CGRect backframe= CGRectMake(0, 0, image.size.width, image.size.height);
UIButton* backButton= [UIButton buttonWithType:UIButtonTypeCustom];
backButton.frame = backframe;
[backButton setBackgroundImage:image forState:UIControlStateNormal];
[backButton setBackgroundImage:imagef forState:UIControlStateHighlighted];
[backButton addTarget:self action:@selector(onBackButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem* someBarButtonItem= [[[UIBarButtonItem alloc] initWithCustomView:backButton] autorelease];
return someBarButtonItem;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.navigationItem.title = _album.albumName;
UIViewController *rootVC = [self.navigationController.viewControllers objectAtIndex:0];
if (rootVC == self || _dismissWhenExit) {
self.navigationItem.leftBarButtonItem = [self createBackBarButton];
}
self.picPullRefreshView = [[[WTPullRefreshView alloc] initWithTableView:_picTableView refreshOn:YES loadMoreOn:NO] autorelease];
_picPullRefreshView.delegate = self;
if (!self.picArray) {
// first time load
self.picArray = [NSMutableArray arrayWithCapacity:100];
[_picPullRefreshView triggerPullRefresh];
}
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)dealloc {
[TMRequest cancelRequestsWithDelegate:self];
self.picListView = nil;
self.picTableView = nil;
self.picPullRefreshView = nil;
self.imView = nil;
self.picArray = nil;
self.picCursor = nil;
[super dealloc];
}
- (void)viewDidUnload {
self.picListView = nil;
self.picTableView = nil;
self.picPullRefreshView = nil;
self.imView = nil;
[super viewDidUnload];
}
#pragma mark - User Click Methods
- (void)onBackButtonClicked:(id)sender {
[self dismissModalViewControllerAnimated:YES];
}
- (void)onPictureClicked:(WTPicture *)aPicture {
WTPictureDetailVC *detailVC = [[[WTPictureDetailVC alloc] init] autorelease];
NSUInteger index = [_picArray indexOfObject:aPicture];
detailVC.hidesBottomBarWhenPushed = YES;
[detailVC setDisplayIndex:index inPictureArray:_picArray hasMore:_picHasMore cursor:_picCursor delegate:self];
[self.navigationController pushViewController:detailVC animated:YES];
}
#pragma mark - Network Methods
- (void)getPictureListSuccess:(TMRequest *)aRequest{
BOOL refresh = (aRequest.tag==1);
if (refresh) {
[_picArray removeAllObjects];
}
TMCursorArray *cursorArray = aRequest.result;
if (cursorArray.array) {
[_picArray addObjectsFromArray:cursorArray.array];
}
self.picHasMore = cursorArray.hasMore;
self.picCursor = cursorArray.cursor;
_picPullRefreshView.needLoadMoreData = cursorArray.hasMore;
[_picTableView reloadData];
[_picPullRefreshView didFinishLoadingSuccess:YES];
}
- (void)getPictureListFail:(TMRequest *)aRequest{
[_picPullRefreshView didFinishLoadingSuccess:NO];
}
- (void)getPictureListFromServerByRefresh:(BOOL)aRefresh {
TMRequest *request = [[WTAlbumService sharedInstance] getPictureListByAlbumId:_album.albumId cursor:aRefresh?nil:_picCursor];
[request setDelegate:self successSel:@selector(getPictureListSuccess:) failSel:@selector(getPictureListFail:)];
if (aRefresh) {
request.tag = 1;
}
[request runAsync];
}
#pragma mark - WTPictureDetailVC Delegate Methods
- (void)pictureDetailVC:(WTPictureDetailVC *)aVC
exitAtPicture:(WTPicture *)aPicture
inPictureArray:(NSArray *)anArray
hasMore:(BOOL)aHasMore
cursor:(NSString *)aCursor
{
if ([_picPullRefreshView isLoading]) {
// 正在加载或者刷新的话,取消请求,避免数据异常
[TMRequest cancelRequestsWithDelegate:self];
[_picPullRefreshView didFinishLoadingSuccess:NO];
}
if ([_picArray count] < [anArray count]) {
// more data loaded
[_picArray removeAllObjects];
[_picArray addObjectsFromArray:anArray];
self.picHasMore = aHasMore;
self.picCursor = aCursor;
_picPullRefreshView.needLoadMoreData = self.picHasMore;
[_picTableView reloadData];
}
int position = NSNotFound;
for (int i=0; i<[_picArray count]; i++) {
WTPicture *temp = [_picArray objectAtIndex:i];
if ([temp.picId isEqualToString:aPicture.picId]) {
position = i;
break;
}
}
if (position != NSNotFound) {
int picCount = position + 1;
int rowCount = picCount / 3;
int mod = picCount % 3;
if (mod > 0) {
rowCount++;
}
int rowIndex = rowCount-1;
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:rowIndex inSection:0];
[_picTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
}
}
- (TMRequest *)pictureDetailVC:(WTPictureDetailVC *)aVC requestForLoadMoreWithCursor:(NSString *)aCursor {
return [[WTAlbumService sharedInstance] getPictureListByAlbumId:_album.albumId cursor:aCursor];
}
- (void)pictureDetailVC:(WTPictureDetailVC *)aVC didPictureDisplayed:(WTPicture *)aPicture {
NSUInteger count = [self.picArray indexOfObject:aPicture]+1; // 加1是因为计算在第几行的时候,是按照个数来算的
int rowCount = count / 3;
int mod = count % 3;
if (mod > 0) {
rowCount++;
}
int rowIndex = rowCount-1;
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:rowIndex inSection:0];
[_picTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
}
#pragma mark - UITableView Delegate Methods
//指定每个分区中有多少行,默认为1
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
int row = [_picArray count] / 3;
int mod = [_picArray count] % 3;
if (mod > 0) {
row ++;
}
return row;
}
-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 105;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"WTAlbumPicListCell";
WTAlbumPicListCell *cell = (WTAlbumPicListCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if(cell == nil){
NSArray *nib = [[NSBundle mainBundle]loadNibNamed:@"WTAlbumPicListCell" owner:self options:nil];
cell = [nib objectAtIndex:0];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
int index1 = indexPath.row * 3;
int index2 = indexPath.row * 3 + 1;
int index3 = indexPath.row * 3 + 2;
WTPicture *pic1 = [_picArray objectAtIndex:index1];
WTPicture *pic2 = nil;
if (index2 < [_picArray count]) {
pic2 = [_picArray objectAtIndex:index2];
}
WTPicture *pic3 = nil;
if (index3 < [_picArray count]) {
pic3 = [_picArray objectAtIndex:index3];
}
[cell setPic1:pic1 pic2:pic2 pic3:pic3];
cell.delegate = self;
return cell;
}
#pragma mark -
#pragma mark WTPullRefreshViewDelegate UIScrollViewDelegate Methods
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
if (scrollView == _picTableView) {
[_picPullRefreshView scrollViewDidScroll:scrollView];
}
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
if (scrollView == _picTableView) {
[_picPullRefreshView scrollViewDidEndDragging:scrollView];
}
}
#pragma mark WTPullRefreshViewDelegate Methods
- (void)pullRefreshViewDidTriggerRefresh:(WTPullRefreshView *)aPullFreshView {
if (aPullFreshView == _picPullRefreshView) {
[self getPictureListFromServerByRefresh:YES];
}
}
- (void)pullRefreshViewDidTriggerLoadMore:(WTPullRefreshView *)aPullFreshView {
if (aPullFreshView == _picPullRefreshView) {
[self getPictureListFromServerByRefresh:NO];
}
}
@end