UIアプリを調整していますが、解決できない問題が発生しました。
コンパクトの高さが4.7インチ未満のすべてのiPhoneに影響することがわかりますが、私のUIはiPhone 4S(3.5インチ)を除いて問題ありません。
私は4.7インチ未満のすべてのiPhoneのレイアウトを変更したくありません。iPhone4Sだけを変更すると同時に、このデバイスを省略したくありません。
3.5インチのポートレートだけに修正を設定できるように回避策はありますか?または私はそこにある1億台のデバイスに別れを告げるべきですか?
難しい質問であり、世論調査に近いことはわかっていますが、技術的にはここで最善の方法を見つけたいと思います。
@all UIPickerViewの有効な高さが3つしかないピッカービュー(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)
}
}
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
私にとってうまくいったアプローチは、すべてのコンパクトサイズクラスに同じ制約を使用することですが、iPhone 4の小さい画面でのビューの配置方法を変更するために、以上の制約と優先順位の組み合わせを使用することでした。
テンキービューの上部とそのスーパービューの間に160以上に設定された(優先度1000で)制約と、キーパッドビューの下部との下部との間の制約があります。 30の定数に設定されているスーパービュー(ただし、優先度は低い750)。
つまり、iPhone 4では、キーパッドの上に160ポイント以上、30ポイント下に十分なスペースがないため、その下のスペースになります。
このアプローチはすべてのケースで機能するわけではありませんが、小さい画面でビューを希望どおりに調整できるようにする一連の優先順位があるかどうかを検討することをお勧めします。
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;
}
}
}
Pavel Alexeevのソリューションの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;
}
}
}