Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 6

0
votes
answers
29 views
+10

斯威夫特:地圖返回4個值作爲2點之間的距離,爲什麼?

0

我計算2點之間的距離。對於第一點,我分配了緯度和經度。第二個座標點在用戶點擊地圖的任何位置進行協調。每件事情都很完美,除了四次打印的答案。斯威夫特:地圖返回4個值作爲2點之間的距離,爲什麼?

  • 我試着返回第一個索引(原來第一個索引是4 的值)。
  • 我試圖將這些值添加到一個集以刪除重複的(它沒有工作)。
  • 我試圖做一個循環,並在第一次後中斷(仍然返回4個值)。 這裏我在哪裏創建用戶點擊(內viewdidAppear)註釋:

let uilpgr = UILongPressGestureRecognizer(target: self, action: #selector(MapViewController.longpress(gestureRecognizer:))) 
     uilpgr.minimumPressDuration = 2 
     map.addGestureRecognizer(uilpgr) 

這是計算的距離(功能viewdidAppear後)功能:

@objc func longpress(gestureRecognizer: UIGestureRecognizer){ 
    let touchPoint = gestureRecognizer.location(in: self.map) 
    let coordinates = map.convert(touchPoint, toCoordinateFrom: self.map) 
    let annotation = MKPointAnnotation() 
    annotation.coordinate = coordinates 
    annotation.title = "Destination" 
    map.addAnnotation(annotation) 

    let source = CLLocation(latitude: 5, longitude: 5) 

    let distination = CLLocation(latitude: coordinates.latitude, longitude: coordinates.longitude) 

    let distanceInMeters = source.distance(from: distination) 
    let distanceInMiles = String(Int(distanceInMeters/1.6)) 

    myArrayDataStructure.myArray.append(distanceInMiles) 
    UserDefaults.standard.set(myArrayDataStructure.myArray, forKey: "items") 
} 
沙发
0
1

你的問題是你如何處理手勢。 「長按」手勢(與其他人一樣)有幾種狀態。當手勢開始時,手勢結束時,手勢被取消時以及在「長按」情況下手勢被更新時,會調用手勢動作。

只有當手勢狀態爲「結束」時,纔想執行距離計算。

@objc func longpress(gestureRecognizer: UIGestureRecognizer){ 
    if gestureRecognizer.state = .ended { 
     // your code here 
    } 
} 
0
votes
answers
37 views
+10

未在單元格內顯示JSON響應

-1

我正在創建Tableview並嘗試在單元格中包含一個通過API從JSON接收的信息。 信息(JSON)收到的很好,並在變量內正確記錄。 但是,我可以發現的是,由於收到的信息帶有一個小的「延遲」,因此不會在單元格創建時刻將單元格的標籤文本設置爲默認變量內容。 我想解決的辦法是在解析JSON內容的時刻更新標籤,對吧?我該怎麼做呢? (更新單元格的標籤後,它已被創建) 任何其他洞察力/解決方案非常感謝。未在單元格內顯示JSON響應

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, AddStock { 

    let operacoesAcoes = ListaOperacoes() 
    var todasAsOperacoes : [Operacao] = [] 

    @IBOutlet weak var acoesTableView: UITableView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     acoesTableView.delegate = self 
     acoesTableView.dataSource = self 
     acoesTableView.register(UINib(nibName: "StandardStockListCell", bundle: nil), forCellReuseIdentifier: "standardCell") 
     operacoesAcoes.consolidaAcoes() 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return operacoesAcoes.carteiraAcoes.count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "standardCell", for: indexPath) as! StandardStockListCell 
     let informacaoCompletaAcao = operacoesAcoes.carteiraAcoes[indexPath.row] 

     cell.codigoTextField.text = informacaoCompletaAcao.codigoAcao 
     cell.nomeTextField.text = informacaoCompletaAcao.nomeAcao 
     cell.quantidadeTotal.text = String(informacaoCompletaAcao.quantidadeTotal) 
     cell.precoMedioLabel.text = String(format: "%.2f", informacaoCompletaAcao.precoMedio) 

     // 
     // This is the part of the code that should set one label with a value returned from "buscaCotacao" but it does not work 
     // because at the time the cell is displayed it is still not updated from JSON information: 
     // Note: the buscaCotacao func is working fine 

     cell.precoAtualLabel.text = buscaCotacao(ativo: informacaoCompletaAcao.codigoAcao) 

     return cell 
    } 
沙发
0
1

您需要在接收並解析JSON之後重新加載主線程上的表視圖。

self.acoesTableView.reloadData()

板凳
0
0

我做了一些研究和選拔賽,並在接收到請求的結果後能想出一個非常簡單的(和現在很明顯)解決方案來更新我的標籤: - 我把它檢索功能來自API的更新信息的信息(「buscaCotacao」),包括[cell row]信息 - 我從函數內部更新單元格的標籤,僅在收到回覆後纔會發生:

func tableView (_ tableView:UITableView,cellForRowAt indexPath:IndexPath) - > UITableViewCell {

let cell = tableView.dequeueReusableCell(withIdentifier: "standardCell", for: indexPath) as! StandardStockListCell 
    let informacaoCompletaAcao = operacoesAcoes.carteiraAcoes[indexPath.row] 

    cell.codigoTextField.text = informacaoCompletaAcao.codigoAcao 
    cell.nomeTextField.text = informacaoCompletaAcao.nomeAcao 
    cell.quantidadeTotal.text = String(informacaoCompletaAcao.quantidadeTotal) 
    cell.precoMedioLabel.text = "R$ "+String(format: "%.2f", informacaoCompletaAcao.precoMedio) 

    buscaCotacao(ativo: informacaoCompletaAcao.codigoAcao, for: cell, indexPath: indexPath) 

    return cell 
} 

而在功能:

FUNC buscaCotacao(ativo:字符串,用於細胞:StandardStockListCell,indexPath:IndexPath){

let finalURL = "https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&interval=1min&apikey=XXXXXXXXXXXXXX&outputsize=compact&symbol=" + ativo 

    Alamofire.request(finalURL, method: .get) 
     .responseJSON { response in 
      if response.result.isSuccess { 
       let resultadoJSON : JSON = JSON(response.result.value!) 
       let resultado = Float (self.parseResultado(json: resultadoJSON))! 
       cell.precoAtualLabel.text = "R$ "+String(format: "%.2f", resultado) 
       self.cotacoes[ativo] = resultado 

      } else { 
       cell.precoAtualLabel.text = "N/D" 
       print("Error: (response.result.error!)") 
      } 
    } 
} 
0
votes
answers
49 views
+10

嘗試從表視圖傳遞多個值到另一個視圖控制器

-2

我想傳遞整個用戶信息,我有一個用戶類。我想將用戶名,名稱,uid,圖像傳遞給另一個視圖控制器。嘗試從表視圖傳遞多個值到另一個視圖控制器

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! NewChatTableViewCell 

     let user = usersarray[indexPath.row] 
     let ColorView = UIView() 
     ColorView.backgroundColor = UIColor(red: 0.05, green: 0.15, blue: 0.28, alpha: 0.7) 
     cell.selectedBackgroundView = ColorView 
     cell.backgroundColor = UIColor.clear 
     cell.backgroundView?.backgroundColor = UIColor.clear 
     cell.firstname.text = user.firstname! + " " + user.lastname! 
     cell.username.text = "@" + user.username! 
     cell.userimage?.layer.masksToBounds = true 
     cell.userimage.layer.cornerRadius = 20 
     cell.userimage.clipsToBounds = true 
     if let profileimage = user.profilepic 
     {cell.userimage.loadImageCache(urlString: profileimage)} 
     return cell 
    } 

    func callmessage(){ 
     let storyboard = UIStoryboard(name: "Main", bundle: nil) 
     let controller = storyboard.instantiateViewController(withIdentifier: "message") 
     self.present(controller, animated: true, completion: nil) 
    } 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     let indexPath = tableView.indexPathForSelectedRow! 
     callmessage(user: User!) 
    } 
+0

提示:'prepareForSegue()'。在目標視圖控制器中設置變量/數組以接收此數據並在當前視圖控制器中爲此方法分配值。祝你好運! –

+0

我會推薦 - 起初至少 - 使用'struct'來處理TableView中的數據。因此,引用另一個ViewCo中的數據ntroller與創建該類型的全局對象一樣簡單。 – KSigWyatt

+0

你也可以在目標類中創建一個元組,並將元組從一個類傳遞到具有所有值的另一個類 –

沙发
0
0

子類的UITableViewCell(創建類型的UITableViewCell的新文件,並調用它像UserTableViewCell添加類型用戶的屬性(或任何你的用戶類)。在didSelectRowAtIndexPath方法設置的UIViewController相同的用戶屬性到UserTableViewCell的User屬性,然後呈現視圖控制器

0
votes
answers
34 views
+10

Swift 4使用選擇器與多個參數

2

我用Swift 4編寫並嘗試編寫一個函數,發送categoryId作爲操作,但我無法寫入。我認爲我的語法是錯誤的。如果我寫函數沒有參數它不是一個問題但我得到參數函數的錯誤。你能說我如何使用選擇器嗎?Swift 4使用選擇器與多個參數

@objc func sendCategoryIdToPackageSelectionVC(categoryId : Int){ 
     MarketVC.categoryId = categoryId 
     self.performSegue(withIdentifier: "sequeGoToPackageSelection", sender: nil) 
    } 

func addTapFeatures(){ 
     taplabel1 = UITapGestureRecognizer(target: self, action: #selector(self.sendCategoryIdToPackageSelectionVC(categoryId:2))) 
     taplabel1?.cancelsTouchesInView = false 
     self.labelFirst.addGestureRecognizer(taplabel1!) 
} 

我得到一個錯誤,說動作選擇器沒有引用任何objc方法。

+0

檢查[該線程](https://stackoverflow.com/q/43251708/6541007)或[此](HTTPS:/ /stackoverflow.com/a/24814958/6541007)。 Swift 4沒有提及'#selector'的用法。 – OOPer

+0

這可能幫助:https://stackoverflow.com/questions/19703767/pass-parameter-to-uitapgesturerecognizer – ozgur

+0

FUNC sendCategoryIdToPackageSelectionVC(的categoryId:智力){ self.performSegue(withIdentifier: 「sequeGoToPackageSelection」,發件人:無) } @objc FUNC callMethod(){ sendCategoryIdToPackageSelectionVC(的categoryId:2) } FUNC addTapFeatures(){ taplabel1 = UITapGestureRecognizer(目標:自,動作:#selector(self.callMethod))? taplabel1 .cancelsTouchesInView =假 } – Yongjoon

沙发
0
0

我想,你不能直接使用選擇器來傳遞參數。 嘗試一下這樣的事情 你應該創建一個調用handleTap(modelObj:myModelObj)的@objc方法。

@objc func someMethod() { // name this properly! 
    handleTap(modelObj: myModelObj) 
} 

然後就可以通過這作爲選擇器:

#selector(someMethod) 
0
votes
answers
33 views
+10

如何創建帶有Read More/Read Less的段落(標籤中)?

-1

我想在最後創建帶有Read More/Read Less的段落(標籤中)。我是iPhone應用程序開發的初學者。如何創建帶有Read More/Read Less的段落(標籤中)?

這是我的代碼... 我得到在其他條件一個錯誤,錯誤是「類型NSLayoutConstraint價值」沒有成員「字體」」在lbl.contant =的getHeight ....

@IBOutlet weak var lbl: NSLayoutConstraint! 

@IBOutlet weak var btn: UIButton!   

var isLabelAtMaxHeight = false 

@IBAction func ButtonAction(_ sender: Any) { 
    if isLabelAtMaxHeight { 
     btn.setTitle("Read more", for: .normal) 
     isLabelAtMaxHeight = false 
     lbl.constant = 70 
    } 
    else { 
     btn.setTitle("Read less", for: .normal) 
     isLabelAtMaxHeight = true 
     lbl.constant = getHeightOfLabel(text:"Isn't it? How to do? I'm sorry I don't know how to solve this exactly. :(– May Phyu Feb 20 at 11:16 No, i dont mean like that. When you set text to label then U have to find height of label then assign that height to label with setting property number of lines = 0 – Jitendra Modi Feb 20 at 11:31" , width: 
      view.bounds.width, font: lbl.font) 
    } 
} 



func getHeightOfLabel(text: String, width: CGFloat, font: UIFont) -> CGFloat 
{ 
    let lbl = UILabel(frame: .zero) 
    lbl.frame.size.width = width 
    lbl.font = font 
    lbl.numberOfLines = 0 
    lbl.text = text 
    lbl.sizeToFit() 
    return lbl.frame.size.height 
} 
+0

@IBOutlet weak var btn: UIButton! @IBOutlet weak var yourParagraphLabel: UILabel! @IBOutlet weak var lblHeight: NSLayoutConstraint! var isLabelAtMaxHeight = false @IBAction func btnAction(_ sender: Any) { if isLabelAtMaxHeight { btn.setTitle("Read more", for: .normal) isLabelAtMaxHeight = false lblHeight.constant = 70 } else { btn.setTitle("Read less", for: .normal) isLabelAtMaxHeight = true lblHeight.constant = getHeightOfLabel(text: yourParagraphText, width: view.bounds.width, font: yourParagraphLabel.font) } } 

獲取高度這是過於寬泛,unresearched的堆棧溢出的問題,很遺憾。你會編輯它來顯示你已經嘗試過什麼,以及你有什麼具體問題? – halfer

+0

@ Shaik.Sahilpasha字體:lbl.font是你的錯誤。在這裏給你的標籤名稱 –

+0

lbl是標籤名稱...... –

沙发
0
0
  • 爲您paragraphLabel的高度約束的出口。你的 「更多」 按鈕paragraphLabel。
  • 機頂佈局0

    點擊「Read more」按鈕增加高度約束常數,點擊「Read less」降低高度約束常數。文本

    func getHeightOfLabel(text: String, width: CGFloat, font: UIFont) -> CGFloat 
    { 
        let lbl = UILabel(frame: .zero) 
        lbl.frame.size.width = width 
        lbl.font = font 
        lbl.numberOfLines = 0 
        lbl.text = text 
        lbl.sizeToFit() 
        return lbl.frame.size.height 
    } 
    
+0

一旦檢查出我的代碼我在ButtonAction其他條件得到一個錯誤.... –

+0

你能解釋更多關於你的代碼嗎?哪一個是你的段落標籤IBoutlet和哪一個你已經採用heightConstraint IBoutlet –

+0

我想你還沒有申報IBOutlet UILabel。您只聲明瞭標籤高度限制。 –

0
votes
answers
25 views
+10

屬性不同的值給一個變量取決於您從中來的類(SWIFT)

3

在我HomeClass有一個static var globalLimit: Int = 0和我通過他的其他類值,這是我準備的功能屬性不同的值給一個變量取決於您從中來的類(SWIFT)

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 



      if let vc = segue.destination as? SelectClass { 
        vc.limit = Int(steppeR.value) 
        HomeClass.globalLimit = Int(steppeR.value) 
        HomeClass.globalRadiusLimit = Int(stepperRadius.value) 
     } 
      else if let np = segue.destination as? CourseClass2 { 
      np.categories = filteredList 
      np.numberPlaces = filteredList.count 
      np.radius = Int(stepperRadius.value) 
     } 

    } 

現在的問題是這樣的,在我的CourseClass2類,我甚至可以從SelectClass達到我有var numberPlaces = 0和他的價值是

override func viewDidLoad() { 
     super.viewDidLoad() 

     numberPlaces = HomeClass.globalLimit 

    } 

,但一樣可以在我準備功能看的時候我進來CourseClass2直接來自HomeClass我想numberPlaces = filteredList.count的價值,但當然它不起作用,因爲它違背它numberPlaces = HomeClass.globalLimit在viewDidload的CourseClass2,所以我怎麼能解決這個問題?

+0

只是聲明var numberPlaces = HomeClass.globalLimit作爲存儲屬性,並從viewDidLoad中刪除它的初始化 –

+0

我該怎麼做? – arc4Random

+0

你已經在CourseClass2中聲明瞭numberPlaces,只是給它賦值。這將是它的默認值,它可以稍後改變,這就是你將要在HomeClass –

沙发
0
0

嘗試這種方式:

設置你的numberPlaces var當成可選:

var numberPlaces: Int? 

然後在視圖檢查並加載,如果它是零:

override func viewDidLoad() { 
    super.viewDidLoad() 

    if numberPlaces == nil { 
     numberPlaces = HomeClass.globalLimit 
    } 
} 
0
votes
answers
33 views
+10

引用以編程方式創建的UI元素

0

我以編程方式創建了許多UI元素。比方說50個UILabels。 什麼是訪問標籤屬性的正確方法? 現在,我通過「發送」加入標籤,在[子視圖]數組,並獲得標註屬性每個標籤和下一個搜索標籤:引用以編程方式創建的UI元素

func buttonTapped(sender: UIButton) { 

     for subview in containerView.subviews { 

      if let label = subview as? UILabel, label.tag == sender.tag { 
// do stuff 
} 
} 
} 

不知道這是最優雅的方式,因爲有一些問題,如果我們將標籤更改爲按鈕。

比方說:

func createButton() { 
    let button = UIButton(frame: CGRect(origin: ..., 
             size: ...)) 

    button.addTarget(self, action: #selector(buttonTapped(sender:)), for: .touchUpInside) 

    let longTap = UILongPressGestureRecognizer(target: self, action: #selector(disableButton(sender:))) 
    longTap.minimumPressDuration = 1 
    button.addGestureRecognizer(longTap) 

    ....... 
    containerView.addSubview(button) 

} 

,現在我不能disableButton(發件人:)方法通過「發件人」訪問屬性,因爲發件人是UILongPressGestureRecognizer。

似乎我做錯了,如果它適用於標籤,但不適用於按鈕。 請,引導我在正確的方向

沙发
0
0

首先,我會保留並列出所有標籤的引用,這樣您就不必遍歷所有子視圖來查找它們,並按照z值最高的順序排列。但是,如果你不想這樣做,那麼你可以在一行中查看代碼;它不是世界上最有效率的東西,但對於你的數字來說它應該沒問題。

class ViewController: UIViewController { 
    let first = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 50)) 
    let second = UILabel(frame: CGRect(x: 25, y: 25, width: 100, height: 50)) 
    override func viewDidLoad() { 
     first.text = "first" 
     first.backgroundColor = .blue 
     second.text = "second" 
     second.backgroundColor = .red 
     view.addSubview(first) 
     view.addSubview(second) 
     let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:))) 
     view.addGestureRecognizer(tap) 
    } 
    @objc func handleTap(sender: UITapGestureRecognizer) { 
     if let label = view.subviews.flatMap({$0 as? UILabel}).last(where: { $0.bounds.contains(sender.location(in: $0))}) { 
      print("You pressed: (label)") 
     } 
    } 
} 

注意什麼回事:

  1. 我們使用flatMap丟棄不UIlabels任何子視圖。
  2. 我們使用last來查找數組中的最後一項( ,因爲根據UIView.subviews,最上面的視圖是最後一個視圖)觸摸位於視圖邊界內。
板凳
0
0

簡單添加此代碼,當你創建標籤

yourLbl.isUserInteractionEnabled = true 

並使用的touchesBegan方法,讓您的點擊標籤

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

    let touch = touches.first 
    if let lblView = touch?.view 
    { 
     if lblView.isKind(of: UILabel.self) 
     { 
      let yourLbl = lblView as! UILabel 

      //Access your clicked lable 
     } 
    } 


} 
+0

但是長時間敲擊怎麼辦?我碰到沒有問題只是觸摸 – drywet

+0

長期按[長按]這個鏈接(https://stackoverflow.com/questions/45243947/uilabel-long-press-gesture-for-menu-item-of-uimenucontroller) –

0
votes
answers
34 views
+10

如何在swift iOS中從lazy var中清除值?

0

我在我的應用程序中使用lazy var。 Lazy var只初始化一次。當我從托盤中刪除應用程序時,它將清除並用新值初始化。我們可以清除前臺狀態的懶惰變量嗎? 如何在swift iOS中從lazy var中清除值?如何在swift iOS中從lazy var中清除值?

+0

對於swift3,[this](https://stackoverflow.com/a/40847994/5555803)的作品。 –

+0

我也在上面的評論^^^中使用來自鏈接帖子的ClearableLazy解決方案。 – Brynjar

沙发
0
0

事情是lazy vars不是常數。你可以隨時在裏面設置數值。他們只是在需要時才被初始化,一旦他們有了價值,他們就會返回這個價值。因此,使用閉包來「創造」價值。

讓我們使用這個信息,以這種方式玩懶惰的變種。在這裏,我們使用了另一個lazy var閉包來捕獲整數存儲的屬性值,併成功地將其重新分配給lazy變量。

class Test { 

    var fooValue:Int = 20 

    lazy var foo = {() -> Int in 
     print("foo called") 
     return self.fooValue*3 
    } 

    lazy var value:Int = foo() 
} 

let test = Test() 
test.value // foo called 
test.value // prints 60 

test.fooValue = 40 
test.value = test.foo() // foo called 
test.value // prints 120 
0
votes
answers
41 views
+10

基於Swift中的觸摸正確地移動Sprite

0

我有一個非常簡單的應用程序。我有從天而降的廣場,這是物理實體。當用戶點擊一個正方形時,它會跳起來。他需要防止水果接觸地面。基於Swift中的觸摸正確地移動Sprite

現在我想,當觸摸蘋果時,只需移動它的position.y += 10。但我希望蘋果能夠在不同的x方向上跳起來,我不知道如何實現這一點。

例如,當我觸摸廣場的左下角時,它不僅應該跳起來,而且還應該向右跳。

任何想法如何實現這個移動到迅速?

+0

檢查此答案,並讓我知道https://stackoverflow.com/questions/38016756/swift-spritekit-rotate-sprite-in-the-direction-of-touch/38017316#38017316 –

+0

謝謝你,但不是我正在尋找。我試圖「踢」spirte節點,就好像你會耍一個足球一樣。 –

沙发
0
3

由於您已經擁有PhysicsBodies,因此您可以使用applyImpulse(_:,at:)在觸摸時將「凹凸」應用於對象。將矢量設置爲向上,將位置設置爲觸摸位置(在對象的座標中)。

或者,對於更多控制,請使用applyImpulse(_:),根據觸摸的X位置將衝動向量設置爲大致向上,並向左或向右偏移,以使其向左或向右推動您正在尋找的位置。那麼爲了增加真實感,你可以在applyAngularImpulse(_:)的同時給它一些旋轉。

+0

不完全是我在找的東西。想象一下我有一個球。當你正好在中間觸摸它時,它會直線上升。但是當你在左下角觸摸它時,它會稍微撞到右側,因爲你在左下角「踢」它。使用applyImpulse幫助碰撞,但只是直線上升。我想避免僅僅使用偏向左側或右側的'dy:',因爲它會根據你觸摸的底角跳到一側。但非常感謝你的負擔先生。 –

+0

@JushKillaB你沒有正確使用applyimpulse。使用atan2來計算你正在接觸的點和球的中心之間的角度,然後使用矢量= x:m * cos(角度),y:m * sin(角度)(假設0度位於右邊部分的x軸)其中m是你的力量的大小 – Knight0fDragon

0
votes
answers
27 views
+10

如何斯威夫特

1

CurrentLocation之間畫一條路線,以SearchedLocation中的MKMapView我需要的當前位置作爲源和搜索的位置作爲目標,但我得到了當前的位置,但在這裏我無法從帶座標(經度和緯度)搜索位置到目的地。 這裏我的目的地顯示零爲什麼? 下面是代碼請幫助我。如何斯威夫特

import UIKit 
import MapKit 
import CoreLocation 
class MapSampViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate, UISearchBarDelegate { 


    //Privacy - Location When In Use Usage Description, Privacy - Location Always Usage Description-------these two add in info.plist 


    @IBOutlet weak var searchBar: UISearchBar! 
    @IBOutlet weak var mapView: MKMapView! 

    var source: CLLocationCoordinate2D! 
    var destination: CLLocationCoordinate2D! 

    var myaddress:String! 
    var mycity:String! 
    var mystate:String! 
    var mycountry:String! 
    var mytitle:String! 
    var mylongitude:String! 
    var mylatitude:String! 
    var locationtoSearch:String! 
    let locationManager = CLLocationManager() 

    var currentlocationPlacemark: CLPlacemark! 

    override func viewDidLoad() { 

     super.viewDidLoad() 
     searchBar.delegate = self 
     mapView.delegate = self 
     mapView.showsScale = true 
     mapView.showsPointsOfInterest = true 
     mapView.showsUserLocation = true 

     if CLLocationManager.locationServicesEnabled() 
     { 
      locationManager.delegate = self 
      locationManager.desiredAccuracy = kCLLocationAccuracyBest 
      locationManager.startUpdatingLocation() 
     } 
     // self.showDirection() 
     } 

    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) { 

     locationtoSearch = self.searchBar.text 
     var geocoder:CLGeocoder = CLGeocoder() 
     geocoder.geocodeAddressString(locationtoSearch!, completionHandler: {(placemarks, error) -> Void in 
      if((error) != nil) 
      { 
      print("Error", error) 
      } 
      else if let placemark = placemarks?[0] as? CLPlacemark { 

      var coordinates:CLLocationCoordinate2D = placemark.location!.coordinate 
      var pointAnnotation:MKPointAnnotation = MKPointAnnotation() 
       pointAnnotation.coordinate = coordinates 
       print(coordinates) 
       // pointAnnotation.title = "(String(describing: placemark.name)),(String(describing: placemark.locality)), (String(describing: placemark.administrativeArea)), (String(describing: placemark.country))" 

       self.myaddress = placemark.name 

       self.mycity = placemark.locality 

       self.mystate = placemark.administrativeArea 

       self.mycountry = placemark.country 

       pointAnnotation.title = "(self.myaddress),(self.mycity),(self.mystate),(self.mycountry)" 

       self.mylongitude = String(stringInterpolationSegment: placemark.location?.coordinate.longitude) 

       self.mylatitude = String(stringInterpolationSegment: placemark.location?.coordinate.latitude) 

       self.mapView?.addAnnotation(pointAnnotation) 

       self.mapView?.centerCoordinate = coordinates 

       print("coordinates (coordinates)") 
       print("The latitude (self.mylatitude)") 
       print("The longitude (self.mylongitude)") 

       self.mapView?.selectAnnotation(pointAnnotation, animated: true) 
      } 
     }) 
     self.showDirection()//i called here or in view viewDidLoad 
     let annotationsToRemove = mapView.annotations.filter { $0 !== self.mapView.userLocation 

     } 
     mapView.removeAnnotations(annotationsToRemove) 
     } 


     func showDirection() 
     { 
     source = locationManager.location?.coordinate//17.6881° N, 83.2131° E 

     // let destination = CLLocationCoordinate2DMake(24.9511, 121.2358)//If i give like this its working 

     destination = CLLocationCoordinate2DMake(Double(mylongitude)!, Double(mylongitude)!)//fatal error: unexpectedly found nil while unwrapping an Optional value 

     let sourcePlacemark = MKPlacemark(coordinate: source!) 
     let destinationPlacemark = MKPlacemark(coordinate: destination) 
     let sourceItem = MKMapItem(placemark: sourcePlacemark) 
     let destinationItem = MKMapItem(placemark: destinationPlacemark) 

     let directionReq = MKDirectionsRequest() 
     directionReq.source = sourceItem 
     directionReq.destination = destinationItem 
     directionReq.transportType = .automobile 

     let directions = MKDirections(request: directionReq) 
     directions.calculate(completionHandler: {(response, error) in 
      if error != nil { 
       print("Error getting directions") 
      } 
      else { 
       let route = response?.routes[0] 
       self.mapView.add((route?.polyline)!, level:.aboveRoads) 

       let rekt = route?.polyline.boundingMapRect 
       self.mapView.setRegion(MKCoordinateRegionForMapRect(rekt!), animated: true) 
       } 
      }) 
     } 

    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { 

     let rendrer = MKPolylineRenderer(overlay: overlay) 
     rendrer.strokeColor = UIColor.blue 
     rendrer.lineWidth = 3 
     return rendrer 
    } 
} 

在這裏,我叫showDirection() FUNC在searchBarSearchButtonClicked卻是越來越來這裏之前爲什麼叫?

+0

對於上述代碼的任何建議.. – Swift

沙发
0
0

方向請求是異步執行的。這意味着您的其他應用程序不會等待提取方向。

您的showDirection函數既獲取方向並將其添加到mapView。最好將這些功能分開。你可以獲取方向,更新一個路線變量,並有一個觀察者,一旦它被提取,它將把路線添加到地圖上。

@IBOutlet weak var mapView: MKMapView! 

var route: MKRoute? { 
didSet { 
    mapView.add((route?.polyline)!, level:.aboveRoads) } 
}