亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS開源一個簡單的訂餐app UI框架

2020-07-26 03:08:33
字體:
來源:轉載
供稿:網友

前言

學 Swift 也有一段時間了,做了一些小的 demo。一直想做個完整的項目,發現這邊學校的外賣訂餐也逐漸流行起來,不像中國有那么多強大的外賣軟件,美國也有,但不多,起碼中國人對那些軟件都不太熟知也不怎么用。打算專門針對午餐的外賣做個app,做了幾天,只做出個 UI,看上去很小的軟件,新手做起來感覺東西還是有點多。 Swift 如何與后端交互 之類的之后再慢慢學吧,有數據庫之類的我都挺熟悉,SQL 或者 MongoDB。

目錄
在這個 app 中,所有 UI 都是用代碼創建的,你可以在 100 Days of Swift 看到,我之前練習的時候都是用的 storyboard,但是到了10頁以上感覺 storyboard 就開始有點亂了,特別是那些 segue 的線牽得滿屏幕都是的時候。之后我就開始用 SnapKit 做 UI 了,雖然比起 CSS 來,還是有點不方便,但用起來感覺還行。下面我大概羅列了一些實現的基本功能:

引導頁
午餐菜單(tableView)
購物車,動畫
下拉刷新
自定義個人主頁 (collectionView)
Reminder 和 Setting 需要后臺,就用了 Alert 來簡單響應了
全屏右滑退出

具體代碼請看我的 Github, 下面我就主要展示一下效果,稍微講一下實現過程,代碼中已有很多注釋。

引導頁

引導頁我是用 collectionView 做的,剛開始先判斷要不要進入引導頁,如果版本更新,則進入。collectionView 滑動方向設置為 .horizontal ,設置任意數量的頁數。添加一個啟動的 startButton ,設置前幾頁都為 startButton.isHidden = true ,最后一頁的時候顯示出來,再添加一個漸出的顯示動畫。

菜單和購物車


shoppingCart

菜單可以下拉刷新,本打算自定義下拉刷新,就像 ALin 的項目中那樣,但是好像有點問題,我就用了自帶的UIRefreshControl ,下拉的時候顯示刷新的時間,稍微調整了下時間的 format。代碼很簡單

復制代碼 代碼如下:
let dateString = DateFormatter.localizedString(from: NSDate() as Date, dateStyle: .medium, timeStyle: .short)
self.refreshControl.attributedTitle = NSAttributedString(string: "Last updated on /(dateString)", attributes: attributes)
self.refreshControl.tintColor = UIColor.white

然后做了個購物車的動畫,將菜單里的圖片先放大后縮小“拋入”購物車,其實是沿著 UIBezierPath 走的一個路徑,這段動畫完了之后,在 animationDidStop() 里做購物車圖片的抖動,和顯示購買的物品數量,那個 countLabel 是個長寬都為 15 的在購物車圖片右上角的 UILabel() 。

先實現一個回調方法,當點擊了cell上的購買按鈕后觸發

func menuListCell(_ cell: MenuListCell, foodImageView: UIImageView) {  guard let indexPath = tableView.indexPath(for: cell) else { return }  // retrieve the current food model, add it to shopping cart model  let model = foodArray[indexPath.section][indexPath.row]  addFoodArray.append(model)  // recalculate the frame of imageView, start animation  var rect = tableView.rectForRow(at: indexPath)  rect.origin.y -= tableView.contentOffset.y  var headRect = foodImageView.frame  headRect.origin.y = rect.origin.y + headRect.origin.y - 64  startAnimation(headRect, foodImageView: foodImageView) }

這是點擊購買之后的動畫實現:

fileprivate func startAnimation(_ rect: CGRect, foodImageView: UIImageView) {  if layer == nil {   layer = CALayer()   layer?.contents = foodImageView.layer.contents   layer?.contentsGravity = kCAGravityResizeAspectFill   layer?.bounds = rect   layer?.cornerRadius = layer!.bounds.height * 0.5   layer?.masksToBounds = true   layer?.position = CGPoint(x: foodImageView.center.x, y: rect.minY + 96)   KeyWindow.layer.addSublayer(layer!)   // animation path   path = UIBezierPath()   path!.move(to: layer!.position)   path!.addQuadCurve(to: CGPoint(x:SCREEN_WIDTH - 25, y: 35), controlPoint: CGPoint(x: SCREEN_WIDTH * 0.5, y: rect.origin.y - 80))  }  groupAnimation() }

這是放大,縮小,拋入購物車的組動畫

 // start group animation: throw, larger, smaller image fileprivate func groupAnimation() {  tableView.isUserInteractionEnabled = false  // move path  let animation = CAKeyframeAnimation(keyPath: "position")  animation.path = path!.cgPath  animation.rotationMode = kCAAnimationRotateAuto  // larger image  let bigAnimation = CABasicAnimation(keyPath: "transform.scale")  bigAnimation.duration = 0.5  bigAnimation.fromValue = 1  bigAnimation.toValue = 2  bigAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)  // smaller image  let smallAnimation = CABasicAnimation(keyPath: "transform.scale")  smallAnimation.beginTime = 0.5  smallAnimation.duration = 1  smallAnimation.fromValue = 2  smallAnimation.toValue = 0.5  smallAnimation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)  // group animation  let groupAnimation = CAAnimationGroup()  groupAnimation.animations = [animation, bigAnimation, smallAnimation]  groupAnimation.duration = 1.5  groupAnimation.isRemovedOnCompletion = false  groupAnimation.fillMode = kCAFillModeForwards  groupAnimation.delegate = self  layer?.add(groupAnimation, forKey: "groupAnimation") }

組動畫結束后的一些動畫效果。

 // end image animation, start other animations func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {  if anim == layer?.animation(forKey: "groupAnimation")  {   // start user interaction   tableView.isUserInteractionEnabled = true   // hide layer   layer?.removeAllAnimations()   layer?.removeFromSuperlayer()   layer = nil   // if user buy any food, show the count label   if self.addFoodArray.count > 0 {    addCountLabel.isHidden = false   }   // show the count label   let goodCountAnimation = CATransition()   goodCountAnimation.duration = 0.25   addCountLabel.text = "/(self.addFoodArray.count)"   addCountLabel.layer.add(goodCountAnimation, forKey: nil)   // shopping cart shaking   let cartAnimation = CABasicAnimation(keyPath: "transform.translation.y")   cartAnimation.duration = 0.25   cartAnimation.fromValue = -5   cartAnimation.toValue = 5   cartAnimation.autoreverses = true   cartButton.layer.add(cartAnimation, forKey: nil)  } }

購物車里面可以增加/減少購買數量,總價跟著會動態變動。主要是有用到了兩個東西,一個是 selected 變量,一個是 reCalculateCount() 函數。根據 selected 來決定最后的總價,如果有變動,則重新計算 (reCalculateCount)。

fileprivate func reCalculateCount() {  for model in addFoodArray! {   if model.selected == true {    price += Float(model.count) * (model.vipPrice! as NSString).floatValue   }  }  // assign price  let attributeText = NSMutableAttributedString(string: "Subtotal: /(self.price)")  attributeText.setAttributes([NSForegroundColorAttributeName: UIColor.red], range: NSMakeRange(5, attributeText.length - 5))  totalPriceLabel.attributedText = attributeText  price = 0  tableView.reloadData() }

沒有實現 Pay() 功能。打算之后嘗試 Apple Pay ,之前用慣了支付寶,剛來美國的時候很難受,其實很多地方中國都已經比美國好很多了。還好現在有了 Apple Pay ,還挺好用的。

自定義個人主頁


profile

本來打算做成簡書那樣,但是。。作為新手感覺還是有點難度。也是因為我這 app 里沒有必要實現那些,就沒仔細研究。

如前面提到的這頁用的 collectionView,兩個 section,一個是 UserCollectionViewCell , 下面是 HistoryCollectionViewCell 。 下面這個 section 像一個 table 的 section,有一個會自動懸浮的 header,這 header 用的是 ALin 大神的輪子, LevitateHeaderFlowLayout() ,當然這個文件的 copyright 是用他的名字的。

class CollectionViewFlowLayout: LevitateHeaderFlowLayout { override func prepare() {  super.prepare()  collectionView?.alwaysBounceVertical = true  scrollDirection = .vertical  minimumLineSpacing = 5  minimumInteritemSpacing = 0 }}

這項目總體來說應該算很小的,如果后端也實現了,也算一個蠻完整的小項目了吧。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩视频一区| 久久久精品国产网站| 美女少妇精品视频| 欧美日韩成人精品| 性金发美女69hd大尺寸| 亚洲欧美日韩一区二区三区在线| 伊人久久精品视频| 日韩欧美国产激情| 成人欧美一区二区三区在线湿哒哒| 亚洲色图50p| 久久久久一本一区二区青青蜜月| 日韩在线一区二区三区免费视频| 亚洲精品一二区| 亚洲综合大片69999| 精品av在线播放| 91亚洲一区精品| 亚洲欧美日韩一区二区在线| 久久精品视频亚洲| 亚洲成人久久电影| 精品国产一区二区三区在线观看| 欧美日韩福利在线观看| 美女扒开尿口让男人操亚洲视频网站| 色偷偷噜噜噜亚洲男人| 一本久久综合亚洲鲁鲁| 欧美精品九九久久| 久久99精品国产99久久6尤物| 日本久久久久久久久久久| 欧美激情亚洲激情| 91视频免费网站| 51视频国产精品一区二区| 91免费精品视频| 欧美成人精品在线观看| 日韩精品在线免费观看视频| 亚洲专区国产精品| 韩国v欧美v日本v亚洲| 欧美日韩xxxxx| 日韩av电影手机在线观看| 日韩成人网免费视频| 欧美怡红院视频一区二区三区| 久久久久久999| 亚洲精品永久免费精品| 国产一区二区三区欧美| 亚洲视频视频在线| 久久6免费高清热精品| 性欧美亚洲xxxx乳在线观看| 91av视频在线观看| 久久视频免费观看| 中文日韩在线视频| 国产区精品在线观看| 92国产精品久久久久首页| 911国产网站尤物在线观看| 欧美激情第6页| 视频直播国产精品| 一区国产精品视频| 国内揄拍国内精品| 热久久视久久精品18亚洲精品| 久久久久久久久久av| 成人黄色免费看| 亚洲裸体xxxx| 久久伊人色综合| 国产精品老牛影院在线观看| 欧美人在线观看| 久久久中精品2020中文| 欧美日本高清一区| 欧美日韩一区免费| 久久精品人人爽| 日韩欧美精品在线观看| 久久九九国产精品怡红院| 91精品久久久久久久久久| 国产日本欧美一区二区三区| 亚洲free性xxxx护士白浆| 欧美日韩精品中文字幕| 国产精品国产亚洲伊人久久| 国产精品亚洲自拍| 欧美黑人巨大精品一区二区| 久久影视电视剧凤归四时歌| 91精品久久久久久久久久| 欧美在线一区二区三区四| 欧美日韩不卡合集视频| 国产男女猛烈无遮挡91| 国产在线观看精品| 久久激情视频久久| 91国产高清在线| 亚洲色图国产精品| 色综合亚洲精品激情狠狠| 国产精品福利久久久| 国产成人在线亚洲欧美| 久久精品视频中文字幕| 中文字幕精品在线视频| 亚洲美女在线看| 欧美成人精品不卡视频在线观看| 欧美黑人又粗大| 亚洲视频精品在线| 国产精品一区=区| 亚洲韩国欧洲国产日产av| 91久久久久久久久久久| 亚洲一级黄色片| 精品国内亚洲在观看18黄| www.欧美视频| 青青久久av北条麻妃黑人| 性夜试看影院91社区| 国产97免费视| 欧美性高潮在线| 91亚洲精品在线观看| 国语自产精品视频在免费| 91精品国产自产在线观看永久| 中文字幕视频在线免费欧美日韩综合在线看| 91亚洲永久免费精品| 97婷婷大伊香蕉精品视频| 亚洲国产成人精品电影| 欧美日韩综合视频| 成人免费激情视频| 中文字幕无线精品亚洲乱码一区| 国产免费一区二区三区在线能观看| 久久久久国产精品www| 亚洲国产91精品在线观看| 国产精品揄拍500视频| 久久久www成人免费精品张筱雨| 亚洲另类图片色| 欧美福利小视频| 揄拍成人国产精品视频| 国产欧美日韩中文字幕在线| 国产精品视频成人| 日韩hd视频在线观看| 亚洲美女在线视频| 欧美激情a在线| 最近中文字幕2019免费| 亚洲国产高清福利视频| 国产成人福利网站| 精品久久久国产精品999| 国产成人福利网站| 成人美女av在线直播| 成人a视频在线观看| 国产精品普通话| 色综合导航网站| 欧美日韩国产精品一区二区三区四区| 在线观看日韩专区| 亚洲日本欧美日韩高观看| 成人精品久久一区二区三区| 亚洲人成在线电影| 亚洲xxx自由成熟| 青青a在线精品免费观看| 国产精品久久久久久婷婷天堂| 亚洲精品福利视频| 5252色成人免费视频| 国产日韩欧美另类| 久久久精品久久久久| 国产精品99久久久久久白浆小说| 欧美在线视频导航| 琪琪亚洲精品午夜在线| 亚洲精品xxxx| 国产精品视频午夜| 国产精品入口免费视| 亚洲精品日韩欧美| 国产亚洲精品久久久| 国产一区二区三区在线观看视频| 欧美一级高清免费播放| 色偷偷91综合久久噜噜| 2021国产精品视频| 日韩在线播放av| 亚洲少妇中文在线| 久久久久久一区二区三区| 国产一区二区三区日韩欧美| 欧美日本中文字幕|