穆索拉

主要功能是使用户能够找到附近的Musolla,并在找到某个位置后提交位置。 奖励的办法是获得前往该musolla的路线并查看详细信息。 的基础,真的。

因此,我正在考虑提交部分。 该数据库位于Github中。 我曾想过要像Terawhere一样拥有自己的服务器,但是谁来维护它呢? 服务器成本太不切实际,难以维护。 因此,我与朋友们进行了交谈,我们决定只坚持使用Github。 那就是所有数据的来源。 我只是认为我可以构建一个可以与Github对话的应用程序。 之前已经做过了。 所以我想为什么不试试看呢?

Github API

我研究了Github API,我的天哪。.很难解密代码。 您知道代码如何。 就像外语一样。 您将最难的事情变成最简单的事情。

无论如何,我坚持了几天,几乎一起放弃了这个项目。 我得到的最疯狂的想法是将数据保留在手机本地,这意味着要存储它。 当然会占用空间。 但这并不能解决将数据实际存储到实际数据库中的问题。

想过使用Firebase,但是我非常着迷于将数据放入Github。 就像我想不出其他任何东西一样。 我只需要这样做。

你看,这就是我的事情。 我会与自己协商,但如果遇到困难,我将无法继续前进,而会尝试。 但是无论如何。

最初,我研究了用于Github API的该库。 很简单,就我的功能而言,拥有了我所需的一切。 除了,当我第一次尝试时,它没有用。 我可以继续尝试,但是失败了。 最终,其中一项尝试在3天后就奏效了。 我所要做的就是替换部分代码。

我在存储库上发布了一个问题。 我发现替换代码并不是最理想的解决方案。 我提供了修复和更新文档的方法。 最终与存储库合并。

图书馆并没有真正配备所有东西。 缺少一些必需品,但它满足了我的需求。 如此道具!

地图叠加层渲染

继续。 这是我为自己设定的一个迷你挑战。 您知道当您在Google Maps或Apple Maps中时,是否有从您的位置到目的地的路线? 我想重新创建。

我曾考虑过使用Google Maps,但考虑到我在Terawhere上设置Google服务所花费的金额,我太懒了。 我只是懒惰,而且我在Github API问题上花了3天的时间。 不想拖更长的时间。

无论如何,苹果公司就是这样。 Apple地图,就像在地图视图中一样。 不是应用程序。 虽然我确实将该应用程序用作扩展程序。

基本上这就是我所做的。

  //设置路线视觉 
 让sourcePlacemark = MKPlacemark.init(坐标:(self.sourceAnnotation?.coordinate)!) 
 让destinationPlacemark = MKPlacemark.init(坐标:(self.destinationAnnotation?.coordinate)!) 

 让directionsRequest = MKDirectionsRequest() 
  DirectionsRequest.source = MKMapItem.init(placemark:sourcePlacemark) 
  DirectionsRequest.destination = MKMapItem.init(placemark:destinationPlacemark) 
  directionsRequest.transportType = .automobile 
 让路线= MKDirections.init(请求:directionsRequest) 
  directions.calculate {(directionsResponse,错误)在 
  //选择第一条路线 
 如果让route = directionsResponse?.routes [0] { 
  self.mapView.add(route.polyline) 
  //绘制地图框架,以便可以看到线条和大头针 
  self.mapView.setVisibleMapRect(route.polyline.boundingMapRect,edgePadding:UIEdgeInsetsMake(30,30,30,30),动画:true) 
  } 
  } 

我确实意识到这些代码块在桌面上的固定代码看起来很可怕。 但是我要离开它。

当然,您必须采用MKMapViewDelegate protocol 。 该协议附带了这种方法。

MKDirectionsRequest希望知道您的位置,目的地以及想要到达目的地的交通工具类型。

MKDirections只是为您计算目的地。 从完成处理程序中,您将获得带有directionsResponse?.routes多条路线。 我选择了第一个折线,将折线添加到了我的地图视图中,并设置了可见矩形(也就是您希望用户关注的地图区域)。 对于所有Web开发人员而言, UIEdgeInsets基本上都是填充。

  // MARK:MKMapViewDelegate函数 
  func mapView(_ mapView:MKMapView,rendererFor overlay:MKOverlay)-> MKOverlayRenderer { 
 让renderer = MKPolylineRenderer.init(overlay:overlay) 
 如果叠加层是MKPolyline { 
  renderer.strokeColor = UIColor.blue 
  renderer.lineWidth = 5 
  } 
 返回渲染器 
  } 

我想相信对于某些人来说这已经足够简单了。

使键盘和文本框相处融洽

啊..这个很有趣。 有几个,我的意思是那里有几个专门从事此工作的库。 我本来可以用的。 但是我决定自己创建一个。 并不是真正创建一个库。 我的意思是,我学会了自己做,就这样吧。

滚动和文本字段的第一件事是什么? 当然,如果您是iOS开发人员,则可以考虑UITextFieldDelegate 。 使用该委托方法检查文本字段之一中的点击,然后向上滚动,以便用户可以看到他或她正在键入的内容。

当然有问题。 如果您是Terawhere的早期用户,您就会知道此问题。

在Musolla,我尝试了一些不同的尝试。 我学会了尝试一种叫做NotificationCenter的新东西。 闪亮的新事物。 好的,让我指导您完成整个过程。

对于表视图中的每个文本字段,都可以设置委托。 这很简单。

在点击时,我仍然使用方便的委托方法。 但是请注意,我使用局部变量来存储当前活动文本字段的Y位置以及当前活动文本字段本身的Y位置。 以后将很有用。

  // MARK:UITextfieldDelegate函数 
  public func textFieldDidBeginEditing(__ textField:UITextField){ 
  //如果您查看main.storyboard 
  //文本字段位于内容视图中,而该内容视图位于单元格中 
  //因此这实际上是单元格的y起源 
  self.cellYForCurrentActiveTextfield =(textField.superview?.superview?.frame.origin.y)! 
  self.currentActiveTextfield = textField 
  } 

当文本字段处于活动状态时,将显示键盘。 现在我们已经注册了一个通知。

 覆盖func viewWillAppear(_动画:布尔){ 
  NotificationCenter.default.addObserver(自身,选择器:#selector(self.keyboardDidShow(notification :)),名称:.UIKeyboardDidShow,对象:无) 
  } 

这就是说,当键盘显示出来时,调用keyboardDidShow(notification:) 。 下面的代码。

  // MARK:键盘通知 
  func keyboardDidShow(notification:NSNotification){ 
 让keyboardRect =(notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as?NSValue)?. cgRectValue 
  //好吧,假设活动文本框在键盘下方 
 如果self.cellYForCurrentActiveTextfield!  >(keyboardRect?.origin.y)!  -150 { 
  //这样就可以计算出两者之间的高度差 
  //如果从此处拉起,则文本字段仍隐藏在键盘后面 
  //,但文本字段位于键盘的顶部边缘 
 让heightDifference = self.cellYForCurrentActiveTextfield!  -((keyboardRect?.origin.y)!-150) 
  //因此,您将多余的100用来拉动scrollview来显示文本字段 
 让pullUp = heightDifference + 100 
 让contentOffset = CGPoint.init(x:0,y:pullUp) 
  self.tableView.setContentOffset(contentOffset,动画:true) 
  } 
  } 

好吧,这里有很多东西。

好吧,首先,您将获得键盘矩形,从该矩形可以获取键盘的Y位置。

然后,您必须计算所敲击的文本字段和键盘之间的高度差。 给它加100点,然后从该数字中将其设置为内容偏移量。

100点仅仅是因为它很好地提升了滚动视图,因此用户可以看到下一个文本字段并可以点击它。

如果您需要有关内容偏移量的说明,请想象一下。 如果您现在正坐下,则初始位置为内容偏移量零。 向前移动2步后,内容偏移量为零加2步。

现在,将其应用于您可以在手机上想到的任何滚动形式。 如果表单没有移动,而您单击了文本字段,则视图会向上移动吗? 这样您就可以看到下一个文本字段供您点击。

您现在在表单中的位置与您的初始位置之间的距离称为内容偏移量。

希望解释是好的。

结论

好了,就是这样。 希望您喜欢阅读。 抱歉,如果有点技术性的话。 我的意思是,此博客文章发出了警告,因此。

另请注意,如果有人想添加一个项目或为该项目做出贡献,则该项目是开源的,您可以在此处找到该项目。 虽然它绝对不是生产准备就绪的,但是请仔细阅读代码!