【问题标题】:Implementing a horizontal compass on the iPhone - algorithm?在 iPhone 上实现水平指南针 - 算法?
【发布时间】:2010-03-27 01:47:54
【问题描述】:

如果您面向正东(90 度),水平罗盘看起来像这样。

85----90---95

如果你正面临西北 355 度,它看起来像这样:

350----355---0

当你转动指南针时,数字应该从 0 -> 360 -> 0 循环

那么,我的问题是,您将如何在 iPhone 上实现这样的视图?我有几个想法:

  1. 制作一张包含所有数字的长图 和刻度线,然后移动它 指南针航向时向左/向右 变化

  2. 将视图片段创建为图块 并在指南针时附加它们 航向变化。

  3. 创建一行刻度线 随指南针方向移动,以及 只需根据需要在上面写上数字即可。

您将如何解决这个问题?我主要是在寻找算法建议,但如果你有代码或伪代码来演示,那也会很有帮助。

【问题讨论】:

    标签: iphone objective-c cocoa-touch


    【解决方案1】:

    选项一是最简单的。请记住,您可以合成图像的一部分来处理环绕。

    【讨论】:

    • 这就是我最终的做法。这并不难。
    • 这种方法的问题是带有文本的图像不能很好地缩放,特别是在上采样到更高分辨率的设备时。您还需要在一些特定于分辨率的图像文件上进行标记,这会使您的二进制文件膨胀。您可以很容易地实现自定义视图并在drawRect: 中进行绘图,并且不会遇到这些问题。
    【解决方案2】:

    这是在iPhone 4中实现水平指南针的完整解决方案

    if ([CLLocationManager locationServicesEnabled] && [CLLocationManager headingAvailable]) 
        {
            m_locationManager=[[CLLocationManager alloc]init];
            m_locationManager.desiredAccuracy=kCLLocationAccuracyBest;
            m_locationManager.headingOrientation=CLDeviceOrientationPortrait;;
            m_locationManager.delegate=self;
            [m_locationManager startUpdatingHeading];
    
        }
    

    pragma mark CLLocationManagerDelegate 方法

    - (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
    {
        CLLocationDirection direction= newHeading.magneticHeading;
        [m_readingsLabel setText:[NSString stringWithFormat:@"Degrees:%f",direction]];
    
        float radians=direction*M_PI/180;
        m_compassImageView.transform=CGAffineTransformMakeRotation(radians);
    }
    

    【讨论】:

      【解决方案3】:

      您可以构建标题的模 10 并切换为 10、5 和所有其他值。

      【讨论】:

        【解决方案4】:

        您只需要实现位置管理器功能即可找到您的 iPhone 指向的确切方向。

        所以,你可以检查一下:

        CLLocationManager *locationManager;
        [locationManager startUpdatingHeading];
        

        每当你调用 startUpdatingHeading() 时,它都会调用 您需要从位置管理器覆盖的“- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading”方法。

        就是这样,您可以通过 newHeading.magneticHeading 或 newHeading.trueHeading 找到 iPhone 3GS 指向的方向。

        你会惊奇地发现,你可以得到与磁罗盘给出的完全相同的方向。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-07
          • 1970-01-01
          相关资源
          最近更新 更多