尺寸类专门用于纵向3.5英寸(iPhone 4S)XCode 6?

时间:2015-03-02 20:33:32

标签: ios iphone xcode autolayout size-classes

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

正如我所看到的,Compact高度会影响4.7英寸以下的所有iPhone,但我的用户界面很好,除了iPhone 4S(3.5英寸)。

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

有任何解决方法,所以我可以设置修正案,但仅适用于3.5英寸的肖像?或者我应该告别那里的1亿台设备吗?

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

5 个答案:

答案 0 :(得分:16)

iPhone 3.5英寸没有尺寸等级。

所以我为NSLayoutConstraint创建了一个类类别,在Interface Builder中编辑它非常容易使用:

size class for iPhone 4/4s in Interface Builder

// GET localhost/admin
$app->get('/admin', function(){
    # code here
});

-

@interface NSLayoutConstraint (Extensions)

@property (nonatomic) IBInspectable CGFloat iPhone3_5_Constant;

@end

答案 1 :(得分:13)

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

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

这意味着在iPhone 4上没有足够的空间可以在键盘上方超过160点并且低于30点,那么它就是下面的空间。

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

答案 2 :(得分:12)

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

答案 3 :(得分:6)

@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)

    }
}

答案 4 :(得分:0)

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;
        }
    }
}