尺码class专供人像3.5寸(iPhone4S)Xcode6?

Size class specifically for portrait 3.5 inch (iPhone 4S) Xcode 6?

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

如我所见,Compact height 影响所有 4.7 英寸以下的 iPhones,但我的 UI 没问题,除了 iPhone 4S(3.5 英寸)。

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

有什么解决方法可以让我设置修正但仅限于 3.5 英寸肖像?还是我应该和外面的 1 亿台设备说再见?

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

@all 我不能把东西变小,因为我正在处理的 pickerviews 恰好只有三个 UIPickerView 的有效高度(162.0、180.0 和 216.0)。尺寸和限制分开。

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

所以虽然我的方法有点难看,但几乎就我的观点。

所以我知道离Goodville很远,别打我,分享一下:

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)

    }
}

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

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

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

虽然这种方法可能并非在所有情况下都有效,但我鼓励您考虑是否有一组优先级可以让您的视图在较小的屏幕上以您想要的方式进行调整。

iPhone 3.5 英寸没有尺码 class。

所以我为 NSLayoutConstraint 创建了一个 class 类别,以便在 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

Swift Pavel Alexeev 解决方案的 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;
        }
    }
}

Swift Pavel Alexeev 解决方案的 5.0 代码,考虑了一些语法更新和屏幕宽度,因为我发现如果在启动应用程序时设备处于横向方向,屏幕高度不是实际的纵向高度,而是当前的横向高度。所以,我检查宽度是否也被考虑在内。如果高度小于 660 AND 宽度小于 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;
        }
    }
}