Подтвердить что ты не робот

Размер класса специально для портрета 3,5 дюйма (iPhone 4S) Xcode 6?

Я настраиваю приложение для UI, но у меня есть проблема, которую я не могу решить.

Как я могу видеть, компактная высота влияет на все iPhone на 4,7 дюйма, но мой пользовательский интерфейс хорош, за исключением iPhone 4S (3,5 дюйма).

Я не хочу изменять макет для всех iPhone с разрешением 4,7 дюйма, просто iPhone 4S, в то же время я не хочу упускать это устройство.

Есть ли способ обхода, поэтому я могу установить поправки, но только и только для 3,5-дюймового портрета? или я должен попрощаться с 100 миллионами устройств?

Я знаю, что это сложный вопрос и почти опрос общественного мнения, но, с технической точки зрения, я хотел бы найти свой лучший выход здесь.

4b9b3361

Ответ 1

@all Я не могу сделать вещи меньше, потому что я имею дело с pickerviews, которые имеют только три допустимые высоты для 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 3,5 дюйма.

Итак, я создал класс класса для NSLayoutConstraint для его редактирования в Interface Builder, который очень прост в использовании:

класс размера для iPhone 4/4s в построителе интерфейса

@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

Ответ 3

Подход, который только что работал у меня, заключался в том, чтобы использовать те же ограничения для всех классов компактных размеров, но использовать комбинацию большего или равного ограничениям и приоритетам для изменения того, как представления были размещены на экране меньшего размера iPhone 4.

У меня есть ограничение между верхней частью представления цифровой клавиатуры и его супервизором, который должен быть больше или равен 160 (с приоритетом 1000) и ограничением между нижней частью экрана клавиатуры и нижней части супервизора, которая установлена ​​в константу 30 (но с более низким приоритетом 750).

Это означает, что на iPhone 4, где не хватает места для более чем 160 пунктов над клавиатурой и на 30 пунктов ниже, тогда это пространство ниже этого.

Хотя этот подход может не работать во всех случаях, я бы посоветовал вам подумать о том, есть ли набор приоритетов, которые позволят вашим представлениям настраиваться так, как вы хотите, на меньшем экране.

Ответ 4

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

Ответ 5

Код Swift 5.0 для решения Павла Алексеева, с учетом некоторых обновлений синтаксиса, а также ширины экрана, потому что я обнаружил, что если устройство удерживается в горизонтальной ориентации при запуске приложения, высота экрана не является фактической высотой портрета, но нынешняя высота ландшафта. Итак, я проверяю, что ширина учитывается тоже. Если высота меньше 660, а ширина меньше 375, у нас есть портрет SE или 5 с.

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