web-dev-qa-db-ja.com

Interface Builderで1px行を作成するにはどうすればよいですか?

注、1ptの行ではなく、1pxの行を作成しようとしていることに注意してください。つまり、画面のスケールに関係なく、1pxになります(Retinaデバイスでは0.5pt)。

プログラムでこれを実行できますが、Interface Builderで実行できますか?たとえば、UIViewの高さを1未満に設定することはできません。

IBで実行できる場合は、アウトレットを宣言してawakeFromNibにフレームを手動で設定する必要はありません。

32
i_am_jorf

他の誰かがプログラムでどのようにそれを行うことができるか知りたいと思ってここに来た場合に備えて、あなたはそれをどのように行うかをここに示します:

インターフェースビルダー

IBで目的のビューに対して高さの制約を作成し、定数を1に設定します。

enter image description here

次に、Ctrlキーを押しながら制約からカスタムビューまたはViewControllerにドラッグする必要があります。

Xibがロードされるたびに、awakeFromNibまたはviewDidLoadのいずれかになり、制約の定数をディスプレイのスケールに設定します。

Swift

onePixelViewHeightConstraint.constant = 1/UIScreen.main.scale//enforces it to be a true 1 pixel line

Objective-C

self.onePixelViewHeightConstraint.constant = 1.f/[UIScreen mainScreen].scale;//enforces it to be a true 1 pixel line

楽しい

50
Daniel Galasko

NSLayoutConstraintサブクラスを作成しました:

class HairlineConstraint: NSLayoutConstraint {
    override func awakeFromNib() {
        super.awakeFromNib()

        self.constant = 1.0 / UIScreen.main.scale
    }
}

次に、インターフェイスビルダーでビューを作成し、高さ制限を追加します

Custom view with height constraint

クラスをHairlineConstraintに設定します。

Set constraint class

できた.

35

NSLayoutConstraintのこの小さなサブクラスを作成することにより、IBに1px行を追加できるようになりました。

@implementation NSLayoutConstraintHairline

-(void)awakeFromNib
{
    [super awakeFromNib];
    if ( self.constant == 1 ) self.constant = 1/[UIScreen mainScreen].scale;
}

@end

値が1の制約をクラスNSLayoutConstraintHairlineに設定して、定数を1ptではなく1pxにすることができます。

定数を別の値に変更することに決めた場合、それは他の制約として機能します。

27
mvds

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で必要な制約を選択できます。

IB objects navigator part

そのプロパティに移動し、値を設定します。

IB properties of NSLayoutConstraint

上記の場合、1x、2x、および3xデバイスで1 pxの高さでビューをレンダリングします。

26
Nevs12

Swiftの場合:

@IBOutlet var hairlineConstraint: NSLayoutConstraint! {
    didSet {
        hairlineConstraint.constant = 1 / UIScreen.mainScreen().scale
    }
}
13

編集:この回答は@ 2xのみのデバイスに対するものでした。当時、@ 3xはまだ市場に出ていませんでした!

最近では、@mdvsの答えが最もクリーンなようです。


IBで1pxラインを作成するのは、網膜のみのデバイスでも困難です。最後に、User Defined Runtime Attributesを使用してそれを達成しました。

以下は、Height Constraintを0.5ピクセル(Retinaデバイスでは1ピクセル)に設定するためのスクリーンショットです。

8
Michał Zygar

@ Nevs12の回答とコメントに基づいて、そのようなものを使用する方が理にかなっていると思います。

extension NSLayoutConstraint {
    @IBInspectable var usePixels: Bool {
        get {
            return false // default Value
        }
        set {
            if newValue {
                constant = constant / UIScreen.mainScreen().scale
            }
        }
    }
}
4
farzadshbfn

それは不可能だと思われ、プログラムでそれを行うか、カスタムビューを作成する必要があります。

2
i_am_jorf

.xibファイルで実行できます。テキストとして編集し、ビューの高さの制約で「1」ではなくconstant = "0.5"を設定するだけです

<constraints>
<constraint firstAttribute="height" constant="0.5" id="xUN-dm-ggj"/>
</constraints>

インターフェイスビルダーで

1
Andrey Snetkov