代码之家  ›  专栏  ›  技术社区  ›  deczaloth

如何使用沙马林.iOS项目?

  •  0
  • deczaloth  · 技术社区  · 6 年前

    怎样才能找出屏幕设备的像素或点密度(每英寸) 沙马林.iOS 项目?

    我找到了一些“解决方案”,比如 the one stated by @JohnHardman in a post in Xamarin Forums (这恰好使用了 XLabs公司 an answer by @SKall 在另一个所谓的线程,并在论坛上说,我不能使用,因为它是“可能”造成拒绝在论坛上 苹果专卖店 ).

    另一个解决办法似乎是使用 沙马林精华 . 然而,他们只会回来 , . 但规模不是我要找的。。。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Lucas Zhang    6 年前

    你可以得到屏幕对角线得到手机型号根据判断屏幕大小的设备。尝试使用以下代码。

    CGSize screenSize = UIScreen.MainScreen.Bounds.Size;
    float screenInch;
    
     // if device is iPhone
     if(UIDevice.CurrentDevice.UserInterfaceIdiom==UIUserInterfaceIdiom.Phone)
        {
          if(screenSize.Height==812)//iPnone X
            {
              screenInch = 5.8f;
            }
    
          else if (screenSize.Height == 736) //iPhone 6p 7p 8p
            {
              screenInch = 5.5f;
            }
    
          else if (screenSize.Height == 667)//iPhone 6 7 8
            {
              screenInch = 4.7f;
            }
    
          else if (screenSize.Height == 568) // iPhone 5 5s 5c se
            {
               screenInch = 4.0f;
            }
    
           else //iPhone 4s and before
            {
               screenInch = 3.5f;
            }
    
         }
    
        2
  •  0
  •   deczaloth    6 年前

    要直接读取我使用的方法,以最终获得像素密度,请阅读下面的“ 我最后的方法


    所以,我做了进一步的研究,找到了一个让我满意的解决方案。我将在这里为后人分享。

    首先, i was told by @ColeX (委员会成员) 沙马林 (团队)那

    没有用于获取每英寸设备的点或像素的公共API 在iOS中。

    因此需要一种不同的方法。首先,我认为我可以通过切换像素大小来获得屏幕大小,这可以在公共API中获得,但正如我在上面给@LucasZ的评论中所写的那样,这将是不精确的,因为

    ipadmini和ipadair:它们都有相同的高度(1024)和比例(2x),但由于PPI不同,它们分别为7.9英寸和9.7英寸。。。

    然后有一个选项,代码来自 XLabs公司 我上面提到的。这个方法我是第一次发现的 a thread Xamarin论坛 ,然后在 a library of XLabs . 不过,这也有违反苹果公司准则的评论的缺点。。。

    令人高兴的是,经过进一步的研究和更多的问答,在 Xamarin论坛 another thread 我被@landu(也是 沙马林 another library :此库还对 hw.machine he answered :

    这应该不是一个问题,因为苹果在提交应用程序时会检查每个应用程序,以查看进行了哪些API调用,并且检索硬件字符串并没有违反规定。我还看到其他电话被拒绝了,但没有硬件设备. 希望这能回答你的问题。当做


    1. 通过使用检索硬件字符串来获取详细的iOS模型 a special library/nuGet/code (或参考 ).
    2. Switch Case上一步获得的详细模型,带有以英寸为单位的屏幕尺寸的公共信息(该信息是公共的,有许多来源,例如臭名昭著的 iosres.com ).
    3. 使用公共API( UIScreen.MainScreen.Bounds.Size )要获得屏幕对角线大小(以像素为单位)(基本毕达哥拉斯数学)并以此计算像素密度: pixels per inch = diagonal-size-in-pixels/diagonal-size-in-inches .

    类人猿

    using System;
    using System.Runtime.InteropServices;
    using ObjCRuntime;
    
    public static string GetiOSModel() =>
        GetSystemProperty(string property);
    
    public static string GetSystemProperty(string property)
    {
        var pLen = Marshal.AllocHGlobal(sizeof(int));
        sysctlbyname(property, IntPtr.Zero, pLen, IntPtr.Zero, 0);
        var length = Marshal.ReadInt32(pLen);
        var pStr = Marshal.AllocHGlobal(length);
        sysctlbyname(property, pStr, pLen, IntPtr.Zero, 0);
        return Marshal.PtrToStringAnsi(pStr);
    }
    
    /// <summary>
    /// Sysctlbynames the specified property.
    /// </summary>
    /// <param name="property">The property.</param>
    /// <param name="output">The output.</param>
    /// <param name="oldLen">The old length.</param>
    /// <param name="newp">The newp.</param>
    /// <param name="newlen">The newlen.</param>
    /// <returns>System.Int32.</returns>
    [DllImport(Constants.SystemLibrary)]
    internal static extern int sysctlbyname(
    [MarshalAs(UnmanagedType.LPStr)] string property,
    IntPtr output,
    IntPtr oldLen,
    IntPtr newp,
    uint newlen);