【问题标题】:Size class specifically for portrait 3.5 inch (iPhone 4S) Xcode 6?专为纵向 3.5 英寸 (iPhone 4S) Xcode 6 设计的尺寸等级?
【发布时间】:2015-05-03 08:18:34
【问题描述】:

我正在调整我的 UI 应用程序,但我遇到了一个无法解决的问题。

正如我所见,Compact 高度会影响所有 4.7 英寸以下的 iPhone,但我的 UI 很好,除了 iPhone 4S(3.5 英寸)。

我不想修改所有 4.7 英寸以下 iPhone 的布局,只修改 iPhone 4S,同时我不想遗漏这台设备。

有什么解决方法可以让我设置修改,但仅适用于 3.5 英寸的肖像?还是我应该告别 1 亿台设备?

我知道这是一个棘手的问题,几乎是一次民意调查,但从技术上讲,我想在这里找到最好的出路。

【问题讨论】:

  • 在这里查看我的答案:stackoverflow.com/a/28093987/1135714
  • 谢谢@CeceXX 你的意思是在代码中要求 iPhone 4S,如果是,手动设置约束?
  • 我发现通过代码创建NSLayoutConstraints 约束并根据用户使用的设备调整它们的constant 值真的很酷。试一试。
  • 您在 3.5 英寸屏幕上的 UI 有什么具体问题?尺寸等级不允许您区分 4S 和 4.7 英寸以下的手机,但您可以使用使其适用于所有屏幕的约束(例如相对于视图的高度进行约束)。
  • 使用约束的目的是让您不必检查您所在的屏幕。你还没有回答我关于细节的问题。你基本上有2个选择;你可以让你的 UI 元素靠得更近,或者你可以让它们更小。这两件事都可以根据屏幕的高度自动完成。如果您不能使用这些自动方式来获得正确的外观,您可以随时在代码中检查屏幕大小,并使用它来替换或修改约束。您应该发布您的 UI 图像,并描述您尝试过的限制条件。

标签: ios iphone xcode autolayout size-classes


【解决方案1】:

@all 我不能让事情变得更小,因为我正在处理 UIPickerView 恰好只有三个有效高度(162.0、180.0 和 216.0)的选择器视图。大小和约束分开。

iPhone 尺寸:http://www.idev101.com/code/User_Interface/sizes.html,4S 独一无二。

因此,尽管我的方法有点丑陋,但我的观点差不多。

所以我知道它离古德维尔很远,不要打我,只是为了分享:

func checkForiPhone4S()
{
    if (UIScreen.mainScreen().bounds.size.height == 480) {
        println("It is an iPhone 4S - Set constraints")

        listPickerView.transform = CGAffineTransformMakeScale(1, 0.8);

        var constraintHeight = NSLayoutConstraint(item: listPickerView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 100)

        self.view.addConstraint(constraintHeight)

        datePickerView.transform = CGAffineTransformMakeScale(1, 0.8);

        var constraintHeightDate = NSLayoutConstraint(item: datePickerView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 100)

        self.view.addConstraint(constraintHeightDate)

    }
}

【讨论】:

    【解决方案2】:

    一种对我有效的方法是对所有紧凑尺寸类使用相同的约束,但使用大于或等于约束和优先级的组合来修改视图在 iPhone 4 较小屏幕上的定位方式。

    我在数字键盘视图的顶部与其父视图之间有一个约束,该约束设置为大于或等于 160(优先级为 1000),并且在键盘视图的底部和设置为常量 30(但优先级较低为 750)的超级视图的底部。

    这意味着在 iPhone 4 上没有足够空间容纳键盘上方 160+ 点和下方 30 点的空间,那么它就是下方的空间。

    虽然这种方法可能不适用于所有情况,但我建议您考虑是否有一组优先级可以让您的视图以您想要的方式在较小的屏幕上进行调整。

    【讨论】:

    • 我认为正确的解决方案是这个。我在 3.5 英寸屏幕上遇到了同样的问题,使用 2 个具有不同优先级的约束可以帮助我解决这个问题。
    • 我同意,我个人的偏好是避免代码中出现“幻数”(为了更好的可维护性)。
    • 这对我来说与比例约束(将典型的 1 乘数更改为例如 0.80)一起用于微调。
    • 谢谢,但你的解释有点模棱两可。 “……低于 30 点,那就是下面的空间。” 你是什么意思?你的意思是 30 点约束是首选,因为在键盘顶部和超级视图顶部之间没有足够的空间?如果是这样,为什么会这样?
    • 这是一个有趣的方法,我发现它很有帮助,虽然它有点棘手
    【解决方案3】:

    iPhone 3.5 英寸没有尺寸等级。

    所以我为 NSLayoutConstraint 创建了一个类类别,以便在 Interface Builder 中对其进行编辑,非常易于使用:

    @interface NSLayoutConstraint (Extensions)
    
    @property (nonatomic) IBInspectable CGFloat iPhone3_5_Constant;
    
    @end
    

    -

    @implementation NSLayoutConstraint (Extensions)
    
    - (CGFloat)iPhone3_5_Constant
    {
        return self.constant;
    }
    
    - (void)setIPhone3_5_Constant:(CGFloat)iPhone3_5_Constant
    {
        if ([UIScreen mainScreen].bounds.size.height < 500) {
            self.constant = iPhone3_5_Constant;
        }
    }
    
    @end
    

    【讨论】:

    • 我也不同意反对者的观点,实际上这是一种可行的方法。
    • 很棒的解决方案!我想知道为什么我不能使用 size classes 来处理 iPhone 4,但这个解决方案是干净而美妙的。效果很好!
    • 唯一遗漏的是 XCode 不会在 iPhone 4S 模式下更新布局。我想这不是我们可以通过使用Extensions 更改NSLayoutConstraint 来控制的。似乎不鼓励从 Extensions 覆盖现有方法。
    • 哈哈,这太简单了,而且效果很好,简直太荒谬了。如果可以的话,我会多次投票!谢谢!!
    【解决方案4】:

    Pavel Alexeev 解决方案的 Swift 3 版本。在 Swift 中,您不能在扩展中使用存储属性,因此我们将其直接应用于 constant 属性。

    extension NSLayoutConstraint
    {
        //We use a simple inspectable to allow us to set a value for iphone 4.
        @IBInspectable var iPhone4_Constant: CGFloat
            {
            set{
                //Only apply value to iphone 4 devices.
                if (UIScreen.mainScreen().bounds.size.height < 500)
                {
                    self.constant = newValue;
                }
            }
            get
            {
                return self.constant;
            }
        }
    }
    

    【讨论】:

    • 我们可以在预览版中测试一下吗?
    • 预览版无法使用,但如果在iphone4模拟器或设备上运行,则可以正常使用。
    【解决方案5】:

    Pavel Alexeev 解决方案的 Swift 5.0 代码,考虑了一些语法更新和屏幕宽度,因为我发现如果在启动应用程序时设备处于横向,屏幕高度不是实际的纵向高度,但当前横向高度。所以,我检查宽度是否也被考虑在内。如果高度小于 660 且宽度小于 375,我们有一个纵向 SE 或 5s。

    extension NSLayoutConstraint
    {
        //We use a simple inspectable to allow us to set a value for iphoneSE / 5s.
        @IBInspectable var iPhoneSE_PortraitConstant: CGFloat
            {
            set{
                //Only apply value to iphone SE and 5s devices.
                 if (UIScreen.main.bounds.size.height < 660 && UIScreen.main.bounds.size.width < 330)
                {
                    self.constant = newValue;
                }
            }
            get
            {
                return self.constant;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-01-19
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多