JXTableMsgChatVC.m 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. #import <QuartzCore/QuartzCore.h>
  2. #import "JXTableMsgChatVC.h"
  3. #import "AppDelegate.h"
  4. //#import "myNearViewController.h"
  5. #import "JXLabel.h"
  6. #import "JXTableView.h"
  7. //#import "JXMainViewController.h"
  8. #import "MJRefreshBaseView.h"
  9. #import "UIImage+Tint.h"
  10. #define REFRESH_HEADER_HEIGHT 60
  11. #define HEIGHT_STATUS_BAR 20
  12. @implementation JXTableMsgChatVC
  13. @synthesize heightFooter,heightHeader,tableHeader,tableFooter,isGotoBack,footerBtnLeft,footerBtnMid,footerBtnRight,headerTitle,isFreeOnClose,isShowHeaderPull,isShowFooterPull,tableView=_table;
  14. @synthesize header=_header;
  15. @synthesize footer=_footer;
  16. - (id)init{
  17. self = [super initWithNibName:nil bundle:nil];
  18. if (self != nil) {
  19. [self setupStrings];
  20. }
  21. return self;
  22. }
  23. //- (id)initWithStyle:(UITableViewStyle)style {
  24. // self = [super initWithStyle:style];
  25. // if (self != nil) {
  26. // [self setupStrings];
  27. // }
  28. // return self;
  29. //}
  30. - (id)initWithCoder:(NSCoder *)aDecoder {
  31. self = [super initWithCoder:aDecoder];
  32. if (self != nil) {
  33. [self setupStrings];
  34. }
  35. return self;
  36. }
  37. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
  38. self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  39. if (self != nil) {
  40. [self setupStrings];
  41. }
  42. return self;
  43. }
  44. - (void)loadView
  45. {
  46. [super loadView];
  47. [self createTableView];
  48. [[self view] addSubview:_table];
  49. }
  50. -(void)createTableView{
  51. if(_table == nil){
  52. // CGRect frame = CGRectMake(0, -70, self.view.frame.size.width, self.view.frame.size.height - 49);
  53. _table = [[JXTableView alloc] initWithFrame:self.view.frame style:UITableViewStylePlain];
  54. _table.frame =CGRectMake(0,heightHeader,self_width,self_height-heightHeader);
  55. _table.touchDelegate = self;
  56. _table.delegate = self;
  57. _table.dataSource = self;
  58. _table.backgroundColor = [UIColor whiteColor];
  59. _table.separatorStyle = UITableViewCellSeparatorStyleNone;
  60. _table.sectionIndexColor = [UIColor grayColor]; //修改右边索引字体的颜色
  61. _table.sectionIndexBackgroundColor = [UIColor clearColor];
  62. [_table setAutoresizesSubviews:YES];
  63. [_table setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
  64. _table.estimatedRowHeight = 0;
  65. _table.estimatedSectionFooterHeight = 0;
  66. _table.estimatedSectionHeaderHeight = 0;
  67. [self.view addSubview:_table];
  68. [self addFooter];
  69. [self addHeader];
  70. }
  71. }
  72. - (void)viewWillAppear:(BOOL)animated{
  73. [super viewWillAppear:animated];
  74. NSLog(@"CurrentController = %@",[self class]);
  75. // UIView *view = g_window.subviews.lastObject;
  76. // NSLog(@"lastObject = %@",g_window.subviews.lastObject);
  77. // if (self.isGotoBack){
  78. //
  79. // if (self.view.frame.origin.x != 0) {
  80. // [UIView animateWithDuration:0.3 animations:^{
  81. //// view.frame = CGRectMake(-85, 0, JX_SCREEN_WIDTH, self.view.frame.size.height);
  82. // [self resetViewFrame];
  83. // }];
  84. // }
  85. // }
  86. }
  87. - (void)viewDidLoad {
  88. [super viewDidLoad];
  89. if (self.isGotoBack) {
  90. // self.view.frame = CGRectMake(JX_SCREEN_WIDTH, 0, JX_SCREEN_WIDTH, JX_SCREEN_HEIGHT);
  91. // [self screenEdgePanGestureRecognizer];
  92. }
  93. //设置分割线
  94. // if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
  95. // [self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 10, 0, 10)];
  96. // }
  97. // if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
  98. // [self.tableView setLayoutMargins:UIEdgeInsetsMake(0, 10, 0, 10)];
  99. // }
  100. _wait = [ATMHud sharedInstance];
  101. }
  102. //创建边缘手势
  103. -(void)screenEdgePanGestureRecognizer
  104. {
  105. UIScreenEdgePanGestureRecognizer *screenPan = [[UIScreenEdgePanGestureRecognizer alloc]initWithTarget:self action:@selector(screenPanAction:)];
  106. screenPan.edges = UIRectEdgeLeft;
  107. [self.view addGestureRecognizer:screenPan];
  108. [self.tableView.panGestureRecognizer requireGestureRecognizerToFail:screenPan];
  109. }
  110. //边缘手势事件
  111. -(void)screenPanAction:(UIScreenEdgePanGestureRecognizer *)screenPan
  112. {
  113. CGPoint p = [screenPan translationInView:self.view];
  114. NSLog(@"p = %@",NSStringFromCGPoint(p));
  115. self.view.frame = CGRectMake(p.x, 0, JX_SCREEN_WIDTH, JX_SCREEN_HEIGHT);
  116. if (screenPan.state == UIGestureRecognizerStateEnded) {
  117. if (p.x > JX_SCREEN_WIDTH/2) {
  118. [self actionQuit];
  119. }else {
  120. [self resetViewFrame];
  121. }
  122. }
  123. }
  124. //- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
  125. //{
  126. //
  127. // if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
  128. // [cell setSeparatorInset:UIEdgeInsetsMake(0, 10, 0, 10)];
  129. // }
  130. // if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
  131. // [cell setLayoutMargins:UIEdgeInsetsMake(0, 10, 0, 10)];
  132. // }
  133. //}
  134. - (void)setupStrings{
  135. // _pSelf = self;
  136. _oldRowCount = 0;
  137. _lastScrollTime = 0;
  138. _isLoading = NO;
  139. heightHeader=JX_SCREEN_TOP;
  140. heightFooter=JX_SCREEN_BOTTOM;
  141. isFreeOnClose = YES;
  142. [g_window endEditing:YES];
  143. // if(isIOS7){
  144. // self.view.frame = CGRectMake(0, -20, self.view.frame.size.width, self.view.frame.size.height);
  145. // }
  146. }
  147. - (void)objectDidDragged:(UIPanGestureRecognizer *)sender {
  148. if (sender.state == UIGestureRecognizerStateEnded){
  149. CGPoint offset = [sender translationInView:g_App.window];
  150. if(offset.y>20 || offset.y<-20)
  151. return;
  152. if(isGotoBack)
  153. [self actionQuit];
  154. else
  155. [self onGotoHome];
  156. }
  157. /*
  158. if (sender.state == UIGestureRecognizerStateChanged ||
  159. sender.state == UIGestureRecognizerStateEnded) {
  160. //注意,这里取得的参照坐标系是该对象的上层View的坐标。
  161. CGPoint offset = [sender translationInView:g_App.window];
  162. //通过计算偏移量来设定draggableObj的新坐标
  163. [self.view setCenter:CGPointMake(self.view.center.x + offset.x, self.view.center.y + offset.y)];
  164. //初始化sender中的坐标位置。如果不初始化,移动坐标会一直积累起来。
  165. [sender setTranslation:CGPointMake(0, 0) inView:g_App.window];
  166. }
  167. */
  168. }
  169. - (void)stopLoading {
  170. _isLoading = NO;
  171. [_footer endRefreshing];
  172. [_header endRefreshing];
  173. }
  174. - (void)dealloc {
  175. NSLog(@"dealloc - %@",[self class]);
  176. [_header free];
  177. [_footer free];
  178. tableHeader = nil;
  179. tableFooter = nil;
  180. _footer = nil;
  181. _header = nil;
  182. self.title = nil;
  183. self.headerTitle = nil;
  184. // _table = nil;
  185. // [super dealloc];
  186. }
  187. -(void)createHeaderView{
  188. tableHeader = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self_width, heightHeader)];
  189. UIImageView* iv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self_width, heightHeader)];
  190. if (THESIMPLESTYLE) {
  191. iv.image = [[UIImage imageNamed:@"navBarBackground"] imageWithTintColor:[UIColor whiteColor]];
  192. }else {
  193. iv.image = [g_theme themeTintImage:@"navBarBackground"];//[UIImage imageNamed:@"navBarBackground"];
  194. }
  195. iv.userInteractionEnabled = YES;
  196. [tableHeader addSubview:iv];
  197. // [iv release];
  198. JXLabel* p = [[JXLabel alloc]initWithFrame:CGRectMake(40, JX_SCREEN_TOP - 15-17, self_width-40*2, 20)];
  199. p.backgroundColor = [UIColor clearColor];
  200. p.textAlignment = NSTextAlignmentCenter;
  201. p.textColor = THESIMPLESTYLE ? [UIColor blackColor] : [UIColor whiteColor];
  202. p.text = self.title;
  203. p.font = [UIFont systemFontOfSize:18.0];
  204. p.userInteractionEnabled = YES;
  205. p.didTouch = @selector(actionTitle:);
  206. p.delegate = self;
  207. p.changeAlpha = NO;
  208. [tableHeader addSubview:p];
  209. // [p release];
  210. self.headerTitle = p;
  211. if(isGotoBack){
  212. self.gotoBackBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, JX_SCREEN_TOP - 46, 46, 46)];
  213. [self.gotoBackBtn setBackgroundImage:[UIImage imageNamed:@"title_back_black_big"] forState:UIControlStateNormal];
  214. [self.gotoBackBtn addTarget:self action:@selector(actionQuit) forControlEvents:UIControlEventTouchUpInside];
  215. [self.gotoBackBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  216. self.gotoBackBtn.titleLabel.font = [UIFont systemFontOfSize:15.0];
  217. self.gotoBackBtn.titleEdgeInsets = UIEdgeInsetsMake(0, 15, 0, 0);
  218. [self.tableHeader addSubview:self.gotoBackBtn];
  219. }
  220. }
  221. -(void)createFooterView{
  222. tableFooter = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self_width, 0)];
  223. tableFooter.backgroundColor = [UIColor whiteColor];
  224. // UIView* line = [[UIView alloc]initWithFrame:CGRectMake(0,0,JX_SCREEN_WIDTH,LINE_WH)];
  225. // line.backgroundColor = THE_LINE_COLOR;
  226. // [tableFooter addSubview:line];
  227. // [line release];
  228. UIButton* btn;
  229. if(isGotoBack)
  230. return;
  231. btn = [UIButton buttonWithType:UIButtonTypeCustom];
  232. btn.frame = CGRectMake((self_width-76)/2, (49-36)/2, 152/2, 72/2);
  233. [btn setBackgroundImage:[UIImage imageNamed:@"singing_button_normal"] forState:UIControlStateNormal];
  234. [btn setBackgroundImage:[UIImage imageNamed:@"singing_button_press"] forState:UIControlStateHighlighted];
  235. [btn addTarget:self action:@selector(onSing) forControlEvents:UIControlEventTouchUpInside];
  236. [tableFooter addSubview:btn];
  237. self.footerBtnMid = btn;
  238. btn = [UIButton buttonWithType:UIButtonTypeCustom];
  239. btn.frame = CGRectMake(self_width-53-5, (49-33)/2, 53, 66/2);
  240. [btn setBackgroundImage:[UIImage imageNamed:@"nearby_button_normal"] forState:UIControlStateNormal];
  241. [btn setBackgroundImage:[UIImage imageNamed:@"nearby_button_press"] forState:UIControlStateHighlighted];
  242. [btn addTarget:self action:@selector(onBtnRight) forControlEvents:UIControlEventTouchUpInside];
  243. [tableFooter addSubview:btn];
  244. self.footerBtnRight = btn;
  245. self.footerBtnRight.hidden = YES;
  246. }
  247. -(JXTableView*)getTableView{
  248. return _table;
  249. }
  250. -(void)createHeadAndFoot{
  251. if(heightHeader==0 && heightFooter==0)
  252. return;
  253. int heightTotal = self.view.frame.size.height;
  254. [self.view addSubview:_table];
  255. if(heightHeader>0){
  256. [self createHeaderView];
  257. [self.view addSubview:tableHeader];
  258. // [tableHeader release];
  259. }
  260. if(heightFooter>0){
  261. [self createFooterView];
  262. [self.view addSubview:tableFooter];
  263. // [tableFooter release];
  264. tableFooter.frame = CGRectMake(0,heightTotal-heightFooter-44,self_width,heightFooter);
  265. }
  266. _table.frame =CGRectMake(0,heightHeader+44,self_width,self_height-heightHeader-heightFooter);
  267. }
  268. -(void) onGotoHome{
  269. // if(self.view.frame.origin.x == 260){
  270. // [g_App.leftView onClick];
  271. // return;
  272. // }
  273. CGContextRef context = UIGraphicsGetCurrentContext();
  274. [UIView beginAnimations:nil context:context];
  275. [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
  276. [UIView setAnimationDuration:0.3];
  277. // self.view.frame = CGRectMake (260, 0, self_width, self.view.frame.size.height);
  278. g_App.mainVc.view.frame = CGRectMake (260, 0, g_App.mainVc.view.frame.size.width, g_App.mainVc.view.frame.size.height);
  279. [UIView commitAnimations];
  280. }
  281. -(void)actionQuit{
  282. [_wait stop];
  283. [g_server stopConnection:self];
  284. [g_window endEditing:YES];
  285. [g_notify removeObserver:self];
  286. [_header removeFromSuperview];
  287. [_footer removeFromSuperview];
  288. _header = nil;
  289. _footer = nil;
  290. // CGContextRef context = UIGraphicsGetCurrentContext();
  291. // [UIView beginAnimations:nil context:context];
  292. // [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
  293. // [UIView setAnimationDuration:0.2];
  294. // [UIView setAnimationDelegate:self];
  295. // [UIView setAnimationDidStopSelector:@selector(doQuit)];
  296. [g_navigation dismissViewController:self animated:YES];
  297. // self.view.frame = CGRectMake (JX_SCREEN_WIDTH, 0, self_width, self.view.frame.size.height);
  298. // NSInteger index = g_window.subviews.count;
  299. // if (index - 2 >= 0) {
  300. // UIView *view = g_window.subviews[index - 2];
  301. // view.frame = CGRectMake (0, 0, self_width, self.view.frame.size.height);
  302. // }
  303. // [UIView commitAnimations];
  304. }
  305. -(void)doQuit{
  306. [self.view removeFromSuperview];
  307. // if(isFreeOnClose)
  308. // _pSelf = nil;
  309. }
  310. -(void)onSing{
  311. // [g_App.leftView onSing];
  312. }
  313. -(void)onBtnRight{
  314. // [g_App.leftView onNear];
  315. }
  316. -(void)actionTitle:(JXLabel*)sender{
  317. }
  318. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
  319. {
  320. return (interfaceOrientation == UIInterfaceOrientationPortrait);
  321. }
  322. //顶部刷新获取数据
  323. -(void)scrollToPageUp{
  324. if(_isLoading)
  325. return;
  326. NSLog(@"scrollToPageUp");
  327. _page = 0;
  328. [self getServerData];
  329. [self performSelector:@selector(stopLoading) withObject:nil afterDelay:1.0];
  330. }
  331. -(void)scrollToPageDown{
  332. if(_isLoading)
  333. return;
  334. _page++;
  335. [self getServerData];
  336. }
  337. -(void)setIsShowHeaderPull:(BOOL)b{
  338. _header.hidden = !b;
  339. isShowHeaderPull = b;
  340. }
  341. -(void)setIsShowFooterPull:(BOOL)b{
  342. _footer.hidden = !b;
  343. isShowFooterPull = b;
  344. }
  345. -(void)getServerData{
  346. }
  347. - (void)addFooter
  348. {
  349. if(_footer){
  350. // [_footer free];
  351. // return;
  352. }
  353. _footer = [MJRefreshFooterView footer];
  354. _footer.scrollView = _table;
  355. __weak JXTableViewController *weakSelf = self;
  356. _footer.beginRefreshingBlock = ^(MJRefreshBaseView *refreshView) {
  357. [weakSelf scrollToPageDown];
  358. // NSLog(@"%@----开始进入刷新状态", refreshView.class);
  359. };
  360. _footer.endStateChangeBlock = ^(MJRefreshBaseView *refreshView) {
  361. // 刷新完毕就会回调这个Block
  362. // NSLog(@"%@----刷新完毕", refreshView.class);
  363. };
  364. _footer.refreshStateChangeBlock = ^(MJRefreshBaseView *refreshView, MJRefreshState state) {
  365. // 控件的刷新状态切换了就会调用这个block
  366. switch (state) {
  367. case MJRefreshStateNormal:
  368. // NSLog(@"%@----切换到:普通状态", refreshView.class);
  369. break;
  370. case MJRefreshStatePulling:
  371. // NSLog(@"%@----切换到:松开即可刷新的状态", refreshView.class);
  372. break;
  373. case MJRefreshStateRefreshing:
  374. // NSLog(@"%@----切换到:正在刷新状态", refreshView.class);
  375. break;
  376. default:
  377. break;
  378. }
  379. };
  380. }
  381. - (void)addHeader
  382. {
  383. if(_header){
  384. // [_header free];
  385. // return;
  386. }
  387. _header = [MJRefreshHeaderView header];
  388. _header.scrollView = _table;
  389. __weak JXTableViewController *weakSelf = self;
  390. _header.beginRefreshingBlock = ^(MJRefreshBaseView *refreshView) {
  391. // 进入刷新状态就会回调这个Block
  392. [weakSelf scrollToPageUp];
  393. };
  394. _header.endStateChangeBlock = ^(MJRefreshBaseView *refreshView) {
  395. // 刷新完毕就会回调这个Block
  396. // NSLog(@"%@----刷新完毕", refreshView.class);
  397. };
  398. _header.refreshStateChangeBlock = ^(MJRefreshBaseView *refreshView, MJRefreshState state) {
  399. // 控件的刷新状态切换了就会调用这个block
  400. switch (state) {
  401. case MJRefreshStateNormal:
  402. // NSLog(@"%@----切换到:普通状态", refreshView.class);
  403. break;
  404. case MJRefreshStatePulling:
  405. // NSLog(@"%@----切换到:松开即可刷新的状态", refreshView.class);
  406. break;
  407. case MJRefreshStateRefreshing:
  408. // NSLog(@"%@----切换到:正在刷新状态", refreshView.class);
  409. break;
  410. default:
  411. break;
  412. }
  413. };
  414. }
  415. -(void)setTitle:(NSString *)value{
  416. self.headerTitle.text = value;
  417. [super setTitle:value];
  418. }
  419. //左移页面
  420. - (void)moveSelfViewToLeft{
  421. [UIView animateWithDuration:0.3 animations:^{
  422. self.view.frame = CGRectMake(-85, 0, JX_SCREEN_WIDTH, self.view.frame.size.height);
  423. }];
  424. }
  425. //归位
  426. - (void)resetViewFrame{
  427. [UIView animateWithDuration:0.3 animations:^{
  428. self.view.frame = CGRectMake(0, 0, JX_SCREEN_WIDTH, self.view.frame.size.height);
  429. }];
  430. }
  431. -(void)doAutoScroll:(NSIndexPath*)indexPath{
  432. if(_oldRowCount == [self tableView:_table numberOfRowsInSection:indexPath.section])//说明翻页之后,数据没有增长,则不再自动翻页,但可手动翻页
  433. return;
  434. if([[NSDate date] timeIntervalSince1970]-_lastScrollTime<0.5)//避免刷新过快
  435. return;
  436. if(isShowHeaderPull && !isShowFooterPull){//如果只有向上翻页
  437. if(indexPath.row == 0){
  438. _oldRowCount = (int)[self tableView:_table numberOfRowsInSection:indexPath.section];
  439. NSLog(@"doAutoScroll=%d",_oldRowCount);
  440. [self scrollToPageUp];
  441. _lastScrollTime = [[NSDate date] timeIntervalSince1970];
  442. // _isLoading = YES;
  443. return;
  444. }
  445. }
  446. if(isShowFooterPull){//如果有向下翻页
  447. if(indexPath.row == [self tableView:_table numberOfRowsInSection:indexPath.section]-1){
  448. _oldRowCount = (int)[self tableView:_table numberOfRowsInSection:indexPath.section];
  449. NSLog(@"doAutoScroll=%d",_oldRowCount);
  450. [self scrollToPageDown];
  451. // _isLoading = YES;
  452. _lastScrollTime = [[NSDate date] timeIntervalSince1970];
  453. return;
  454. }
  455. }
  456. }
  457. -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
  458. return 0;
  459. }
  460. -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
  461. return [[UITableViewCell alloc] init];
  462. }
  463. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  464. // 防止重复点击
  465. tableView.userInteractionEnabled = NO;
  466. dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
  467. tableView.userInteractionEnabled = YES;
  468. });
  469. }
  470. - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
  471. [self.view endEditing:YES];
  472. }
  473. @end