iOS高仿城觅应用客户端项目(开发思路和代码)
?
這是一款非常完整的一個ios項目,基本實現了我們常用的一些功能了,而且界面設計個人感覺還是挺不錯的,是一個不錯的學習ios項目,喜歡的朋友可以參考一下吧。 項目展示,由于沒有數據,所以所有的cell顯示的都是我自己寫的數據。 源碼下載: http://code.662p.com/view/11240.html? ?
抽屜 ?
首頁部分效果 ?
? 首頁效果
? 部分效果
? 發現
? 消息
搜索 ?
? 設置
? 模糊效果
? 代碼注釋展示
? 代碼注釋展示 還有很多細節就不一一展示了,大家將代碼運行下自己查看即可。由于內容比較多,我就按功能模塊來介紹給大家了。 首先是左邊抽屜的效果以及點擊按鈕切換控制器
WNXNavigationController *newNC = self.childViewControllers[toIndex]; if (toIndex == WNXleftButtonTypeIcon) { newNC = self.childViewControllers[fromIndex]; } //移除舊的控制器view WNXNavigationController *oldNC = self.childViewControllers[fromIndex]; [oldNC.view removeFromSuperview]; //添加新的控制器view [self.view addSubview:newNC.view]; newNC.view.transform = oldNC.view.transform; self.showViewController = newNC.childViewControllers[0]; 這樣就完成了切換控制器
首頁
設置navigationBar.layer的背景色 以及根據顏色畫出navigationBar的背景圖片4種辦法都無法達到原生的效果 最后采用將navigationBar隱藏,自己放一個View了冒充導航條來解決這個問題 發現
{ /* 攔截事件響應者,不論觸發了cell中的哪個控件都交給iconButton來響應 */ // 1.判斷當前控件能否接收事件 if (self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) return nil; // 2. 判斷點在不在當前控件 if ([self pointInside:point withEvent:event] == NO) return nil; return self.iconButton; } 但 這里需要注意這樣攔截cell的點擊事件,在collectionView的cell被點擊觸發didDeselectItemAtIndexPath: 就不會被觸發了,我的解決方法是在點擊button時通過代理方法傳給collectionView,外部在通過知道點擊了那個cell,push到下一 個控制器,并將cell的model賦值給下一個控制器 登陸(登陸只用了微信和新浪登陸,不涉及到注冊就非常簡單,這些只需去官網下來登陸和分享的sdk集成進來即可,我一般使用友盟平臺,包括崩潰統計,三方登陸,分享,用戶分析等等) 消息
當點擊刪除全部的時候,就清空本地的歸檔數據,下次接受的服務器的數據在重新寫入 因為是模擬的數據,為了保障每次進來都有數據,就沒有實現歸檔解檔的操作,所以每次刪除后重新進入會再次有數據
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self.tableView reloadData]; });
搜索 ?
{ _hotDatas = hotDatas; //判斷是長度是否是4,開發中可以這樣寫 應該服務器返回幾條數據就賦值多少,而不是固定的寫死數據, //萬一服務器返回的數據有錯誤,會造成用戶直接閃退的,有 //時在某些不是很重要的東西無法確定返回的是否正確,建議用 //@try @catch來處理, //即便返回的數據有誤,也可以讓用戶繼續別的操作, //而不會在無關緊要的小細節上造成閃退 if (hotDatas.count == 4) { [self.hotButton1 setTitle:hotDatas[1] forState:UIControlStateNormal]; [self.hotButton2 setTitle:hotDatas[0] forState:UIControlStateNormal]; [self.hotButton3 setTitle:hotDatas[2] forState:UIControlStateNormal]; [self.hotButton4 setTitle:hotDatas[3] forState:UIControlStateNormal]; } [self layoutIfNeeded]; //算出間距 CGFloat margin = (WNXAppWidth - 40 - self.hotButton1.bounds.size.width - self.hotButton2.bounds.size.width - self.hotButton3.bounds.size.width - self.hotButton3.bounds.size.width) / 3; //更新約束 [self.hotButton2 updateConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.hotButton1.right).offset(margin); }]; [self.hotButton3 updateConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.hotButton2.right).offset(margin); }]; [self.hotButton4 updateConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.hotButton3.right).offset(margin); }]; } 模糊效果
? 模糊效果
詳情頁
詳情頁展示 ?
? -(void)scrollViewDidScroll:(UIScrollView *)scrollView{ if (scrollView == self.rmdTableView || scrollView == self.infoTableView) {//說明是tableView在滾動 //記錄當前展示的是那個tableView self.showingTableView = (UITableView *)scrollView; //記錄出上一次滑動的距離,因為是在tableView的contentInset中偏移的ScrollHeadViewHeight,所以都得加回來 CGFloat offsetY = scrollView.contentOffset.y; CGFloat seleOffsetY = offsetY - self.scrollY; self.scrollY = offsetY; //修改頂部的scrollHeadView位置 并且通知scrollHeadView內的控件也修改位置 CGRect headRect = self.topView.frame; headRect.origin.y -= seleOffsetY; self.topView.frame = headRect; //根據偏移量算出alpha的值,漸隱,當偏移量大于-180開始計算消失的值 CGFloat startF = -180; //初始的偏移量Y值為 頂部倆個控件的高度 CGFloat initY = SelectViewHeight + ScrollHeadViewHeight; //缺少的那一段漸變Y值 CGFloat lackY = initY + startF; //自定義導航條高度 CGFloat naviH = 64; //漸隱alpha值 CGFloat alphaScaleHide = 1 - (offsetY + initY- lackY) / (initY- naviH - SelectViewHeight - lackY); //漸現alph值 CGFloat alphaScaleShow = (offsetY + initY - lackY) / (initY - naviH - SelectViewHeight - lackY) ; if (alphaScaleShow >= 0.98) { //顯示導航條 [UIView animateWithDuration:0.04 animations:^{ self.naviView.alpha = 1; }]; } else { self.naviView.alpha = 0; } self.topScrollView.naviView.alpha = alphaScaleShow; self.subTitleLabel.alpha = alphaScaleHide; self.smallImageView.alpha = alphaScaleHide; /* 這段代碼很有深意啊。。最開始是直接用偏移量算的,但是回來的時候速度比較快時偏移量會偏度很大 然后就悲劇了。換了好多方法。。最后才開竅T——T,這一段我會在blog里面詳細描述我用的各種錯誤的方法 用了KVO監聽偏移量的值,切換了selectView的父控件,切換tableview的headView。。。 */ if (offsetY >= -(naviH + SelectViewHeight)) { self.selectView.frame = CGRectMake(0, naviH, WNXAppWidth, SelectViewHeight); } else { self.selectView.frame = CGRectMake(0, CGRectGetMaxY(self.topView.frame), WNXAppWidth, SelectViewHeight); } CGFloat scaleTopView = 1 - (offsetY + SelectViewHeight + ScrollHeadViewHeight) / 100; scaleTopView = scaleTopView > 1 ? scaleTopView : 1; //算出頭部的變形 這里的動畫不是很準確,好的動畫是一點一點試出來了 這里可能還需要配合錨點來進行動畫,關于這種動畫我會在以后單開一個項目配合blog來講解的 這里這就不細調了 CGAffineTransform transform = CGAffineTransformMakeScale(scaleTopView, scaleTopView ); CGFloat ty = (scaleTopView - 1) * ScrollHeadViewHeight; self.topView.transform = CGAffineTransformTranslate(transform, 0, -ty * 0.2); //記錄selectViewY軸的偏移量,這個是用來計算每次切換tableView,讓新出來的tableView總是在頭部用的, //現在腦子有點迷糊 算不出來了。。凌晨2.57分~ CGFloat selectViewOffsetY = self.selectView.frame.origin.y - ScrollHeadViewHeight; if (selectViewOffsetY != -ScrollHeadViewHeight && selectViewOffsetY = (0.5 + index)) { [self.selectView lineToIndex:index + 1]; } else if (seleOffsetX < 0 && offsetX / WNXAppWidth <= (0.5 + index)) { [self.selectView lineToIndex:index]; } } } 這些就是這個項目的大體思路,當然還有很多很多的細節都在代碼中,第一次嘗試將思路寫出來,感覺有很多不足,本應該每寫完一個功能就總結一下,而我是在發布的晚上回頭總結的,有很多當時的思路不是很清晰了... 請直接打開WNXHuntForCity.xcworkspace
? 打開 而不要打開WNXHuntForCity.xcodeproj |
詳細說明:http://ios.662p.com/thread-2519-1-1.html
轉載于:https://www.cnblogs.com/yayabei/p/4831309.html
總結
以上是生活随笔為你收集整理的iOS高仿城觅应用客户端项目(开发思路和代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编译过程
- 下一篇: java13 InputStream,