Ta sẽ làm ứng dụng la bàn chỉ hướng
Bắc.
Kéo icon la bàn vào project,
icon ta dùng sẽ như sau.
Tạo class mới, thêm dòng import
import CoreLocation
Thêm dòng sau vào khai báo class
CLLocationManagerDelegate
Khai báo image, 5 label và một
biến location, một biến Double.
let im = UIImage(named: "laban")
var ima: UIImageView!
var de = 0.0
var la:UILabel!
var la2:UILabel!
var la3:UILabel!
var la4:UILabel!
var la5:UILabel!
privatelet locationManager = CLLocationManager()
Khởi tạo, định vị, set chữ, nhét
vào view trong viewDidLoad.
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
locationManager.startUpdatingHeading()
view.backgroundColor = UIColor.whiteColor()
ima = UIImageView(frame: CGRect(x: 5, y: 110, width: 310, height: 315))
ima.image = im
la = UILabel(frame: CGRect(x: 5, y: 50, width: 95, height: 60))
la2 = UILabel(frame: CGRect(x: 55, y: 410, width: 95, height: 20))
la3 = UILabel(frame: CGRect(x: 205, y: 410, width: 95, height: 20))
la4 = UILabel(frame: CGRect(x: 132, y: 410, width: 95, height: 20))
la5 = UILabel(frame: CGRect(x: 292, y: 410, width: 95, height: 20))
la2.text = "Latitude:"
la3.text = "Longitude:"
ima.center = CGPoint(x: view.center.x, y:250)
la.center = CGPoint(x: view.center.x, y:70)
la.textColor=UIColor.blueColor()
la2.textColor=UIColor.orangeColor()
la3.textColor=UIColor.orangeColor()
la4.textColor=UIColor.orangeColor()
la5.textColor=UIColor.orangeColor()
la.font = UIFont(name:"Arial",size:32)
la.sizeToFit()
view.addSubview(ima)
view.addSubview(la)
view.addSubview(la2)
view.addSubview(la3)
view.addSubview(la4)
view.addSubview(la5)
Ta dùng một label hiển thị độ hướng,
4 cái còn lại là số kinh vĩ độ của người dùng.
Copy các hàm cần dùng xuống trên
ngoặc đóng cuối cùng.
func locationManager(manager: CLLocationManager, didUpdateHeading heading: CLHeading) {
de = heading.magneticHeading
la.text = String(round1(de))+gk(de)
UIView.animateWithDuration(0.0, animations: {
self.ima.transform = CGAffineTransformMakeRotation(CGFloat(360-self.de) * CGFloat(M_PI)/180)
})
}
func gk(degrees: Double)->String {
var l=""
if(degrees >= 337.5 || degrees <22.5) {
l = "N"; }
if(degrees >= 22.5&& degrees <67.5) {
l = "NE"; }
if(degrees >= 67.5&& degrees <112.5) {
l = "E"; }
if(degrees >= 112.5&& degrees <157.5) {
l = "SE"; }
if(degrees >= 157.5&& degrees <202.5) {
l = "S"; }
if(degrees >= 202.5&& degrees <247.5) {
l = "SW"; }
if(degrees >= 247.5&& degrees <292.5) {
l = "W"; }
if(degrees >= 292.5&& degrees <337.5) {
l = "NW"; }
return"°"+l
}
overridefunc prefersStatusBarHidden() ->Bool {
returntrue
}
func round1(a:Double)->Double{
let mu = pow(10.0,2.0)
let r=round(a*mu)/mu
return r
}
func locationManager(manager: CLLocationManager,
didChangeAuthorizationStatus status: CLAuthorizationStatus) {
print("Authorization
status changed to \(status.rawValue)")
switch status {
case .Authorized, .AuthorizedWhenInUse:
locationManager.startUpdatingLocation()
default:
locationManager.stopUpdatingLocation()
}
}
func locationManager(manager: CLLocationManager,
didFailWithError
error: NSError) {
// print ("error")
let errorType = error.code == CLError.Denied.rawValue
? "Access Denied": "Error \(error.code)"
let alertController = UIAlertController(title: "Location
Manager Error",
message: errorType, preferredStyle: .Alert)
let okAction = UIAlertAction(title: "OK", style: .Cancel,
handler: {
action in })
alertController.addAction(okAction)
presentViewController(alertController,
animated: true,
completion: nil)
}
func locationManager(manager: CLLocationManager, didUpdateLocations
locations: [CLLocation]) {
iflet newLocation = locations.last {
let latitudeString = String(format: "%g\u{00B0}",
round1(newLocation.coordinate.latitude))
la4.text = latitudeString
let longitudeString = String(format: "%g\u{00B0}",
round1(newLocation.coordinate.longitude))
la5.text = longitudeString
if newLocation.horizontalAccuracy<0 {
// invalid accuracy
return
}
if newLocation.horizontalAccuracy>100 ||
newLocation.verticalAccuracy>50 {
// accuracy radius is
so large, we don't want to use it
return
}
}
}
Để xin quyền truy xuất vị trí,
phải xin phép người dùng, nháy chuột phải vào file info.plist, open as, source
code để bật ra mã của nó, copy các dòng sau vào gần cuối.
<key>NSLocationWhenInUseUsageDescription</key>
<string>This app requires access to your location</string>
Khi bạn mở ứng dụng lại, sẽ có
thông báo sau
Ấn Allow là xong.
Chạy thử ra máy thật để thấy la
bàn hoạt động. Máy ảo chỉ chạy được số kinh vĩ độ, không chạy la bàn.
No comments:
Post a Comment