注、1ptの行ではなく、1pxの行を作成しようとしていることに注意してください。つまり、画面のスケールに関係なく、1pxになります(Retinaデバイスでは0.5pt)。
プログラムでこれを実行できますが、Interface Builderで実行できますか?たとえば、UIViewの高さを1未満に設定することはできません。
IBで実行できる場合は、アウトレットを宣言してawakeFromNib
にフレームを手動で設定する必要はありません。
他の誰かがプログラムでどのようにそれを行うことができるか知りたいと思ってここに来た場合に備えて、あなたはそれをどのように行うかをここに示します:
IBで目的のビューに対して高さの制約を作成し、定数を1に設定します。
次に、Ctrlキーを押しながら制約からカスタムビューまたはViewControllerにドラッグする必要があります。
Xibがロードされるたびに、awakeFromNib
またはviewDidLoad
のいずれかになり、制約の定数をディスプレイのスケールに設定します。
onePixelViewHeightConstraint.constant = 1/UIScreen.main.scale//enforces it to be a true 1 pixel line
self.onePixelViewHeightConstraint.constant = 1.f/[UIScreen mainScreen].scale;//enforces it to be a true 1 pixel line
楽しい
NSLayoutConstraint
のこの小さなサブクラスを作成することにより、IBに1px行を追加できるようになりました。
@implementation NSLayoutConstraintHairline
-(void)awakeFromNib
{
[super awakeFromNib];
if ( self.constant == 1 ) self.constant = 1/[UIScreen mainScreen].scale;
}
@end
値が1の制約をクラスNSLayoutConstraintHairline
に設定して、定数を1ptではなく1pxにすることができます。
定数を別の値に変更することに決めた場合、それは他の制約として機能します。
XCode 6および@IBInspectable
および@IBDesignable
キーワードは間違いなく可能であり、かなり単純です。サブクラス化/アウトレットする必要はありません。
NSLayoutConstraintの拡張(カテゴリ)は、次のコード(Swift)で実行できます。
extension NSLayoutConstraint {
@IBInspectable var preciseConstant: Int {
get {
return Int(constant * UIScreen.mainScreen().scale)
}
set {
constant = CGFloat(newValue) / UIScreen.mainScreen().scale
}
}
}
次に、IBで必要な制約を選択できます。
そのプロパティに移動し、値を設定します。
上記の場合、1x、2x、および3xデバイスで1 pxの高さでビューをレンダリングします。
Swiftの場合:
@IBOutlet var hairlineConstraint: NSLayoutConstraint! {
didSet {
hairlineConstraint.constant = 1 / UIScreen.mainScreen().scale
}
}
編集:この回答は@ 2xのみのデバイスに対するものでした。当時、@ 3xはまだ市場に出ていませんでした!
最近では、@mdvs
の答えが最もクリーンなようです。
IBで1pxラインを作成するのは、網膜のみのデバイスでも困難です。最後に、User Defined Runtime Attributes
を使用してそれを達成しました。
以下は、Height Constraintを0.5ピクセル(Retinaデバイスでは1ピクセル)に設定するためのスクリーンショットです。
@ Nevs12の回答とコメントに基づいて、そのようなものを使用する方が理にかなっていると思います。
extension NSLayoutConstraint {
@IBInspectable var usePixels: Bool {
get {
return false // default Value
}
set {
if newValue {
constant = constant / UIScreen.mainScreen().scale
}
}
}
}
それは不可能だと思われ、プログラムでそれを行うか、カスタムビューを作成する必要があります。
.xibファイルで実行できます。テキストとして編集し、ビューの高さの制約で「1」ではなくconstant = "0.5"を設定するだけです
<constraints>
<constraint firstAttribute="height" constant="0.5" id="xUN-dm-ggj"/>
</constraints>