Размер класса специально для портрета 3,5 дюйма (iPhone 4S) Xcode 6?
Я настраиваю приложение для UI, но у меня есть проблема, которую я не могу решить.
Как я могу видеть, компактная высота влияет на все iPhone на 4,7 дюйма, но мой пользовательский интерфейс хорош, за исключением iPhone 4S (3,5 дюйма).
Я не хочу изменять макет для всех iPhone с разрешением 4,7 дюйма, просто iPhone 4S, в то же время я не хочу упускать это устройство.
Есть ли способ обхода, поэтому я могу установить поправки, но только и только для 3,5-дюймового портрета? или я должен попрощаться с 100 миллионами устройств?
Я знаю, что это сложный вопрос и почти опрос общественного мнения, но, с технической точки зрения, я хотел бы найти свой лучший выход здесь.
Ответы
Ответ 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;
}
}
}