Nota, yo estoy buscando para hacer una 1px línea, no un 1pt línea. Lo que significa que debe ser 1px independientemente de la pantalla de la escala (así 0.5 pt en la Retina de los dispositivos).

Me puede hacer esto mediante programación, pero puedo hacerlo en el Interface Builder? Por ejemplo, yo no se puede establecer una UIView a tener una altura de menos de 1.

Si puedo hacerlo en IB, entonces no tiene que declarar una toma de corriente y manual de establecer el marco en awakeFromNib.

  • um… entonces no lo hagas en IB… puede crear vistas personalizadas que hace el dibujo y el uso de la vista personalizada?
  • Yo sí puedo. Pero sería bueno si puedo hacerlo en IB para ser coherente. Si no es posible, eso está bien. Parece que debería ser posible.
  • posibles duplicados de Cómo Dibujar una sola línea de punto en iOS
  • Víctima de un número de control de calidad, stackoverflow.com/a/22694062/294884
  • Si estás tratando de usar de ellos como los bordes o a otras cosas… creo que es mejor usar CALayer (si es posible), UIViews no son muy eficientes para el uso como tal cosa.
  • Sólo por curiosidad, ¿por qué quieres hacerlo? ¿Cuál es el punto de tener la línea más gruesa en la no-retina display, y extremadamente delgada línea en la retina de uno. (Y tomar en consideración, que en el futuro, su 1px, podría ser incluso más delgado,asumiendo una mayor resolución iDevices)
  • Los diseñadores querían una 1px línea. Yo creo que ellos estaban tratando de imitar a Apple de la tabla de puntos de vista que han 1px separadores (por ejemplo, Correo -> Bandeja de entrada).

InformationsquelleAutor i_am_jorf | 2014-05-14

10 Comentarios

  1. 50

    Sólo en caso de que alguien más viene aquí con el deseo de saber cómo se puede hacer mediante programación, aquí tienes la manera de hacerlo:

    Interface Builder

    Hacer una restricción de altura en IB a la vista que desee y establecer la constante de 1.

    ¿Cómo puedo crear una 1px línea en el Interface Builder?

    Entonces usted necesitará CTRL+Arrastre de la restricción en la vista personalizada o ViewController.

    Siempre que el Xib se carga, sea en awakeFromNib o viewDidLoad, que se va a establecer la constante de la restricción a la escala de la pantalla:

    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

    Disfrutar de

    • Parece que no se puede hacer en IB.
  2. 35

    He creado NSLayoutConstraint subclase:

    class HairlineConstraint: NSLayoutConstraint {
        override func awakeFromNib() {
            super.awakeFromNib()
    
            self.constant = 1.0 / UIScreen.main.scale
        }
    }

    A continuación, simplemente crear su vista en el interface builder, aumentar la altura de la restricción de la

    ¿Cómo puedo crear una 1px línea en el Interface Builder?

    y establece su clase para HairlineConstraint.

    ¿Cómo puedo crear una 1px línea en el Interface Builder?

    Hecho.

  3. 27

    Por la creación de esta pequeña subclase de NSLayoutConstraint ahora soy capaz de agregar 1px líneas en IB:

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

    Cualquier restricción con un valor de 1 se puede ajustar a la clase NSLayoutConstraintHairline para hacer que la constante efectiva de 1px en lugar de 1 pt.

    Si alguna vez decide cambiar la constante a otro valor, éste funcionará como cualquier otra restricción.

    • Por lejos la forma más limpia que puedo encontrar, gracias!
    • Con xCode6 se puede hacer aún más claro, por favor vea mi respuesta.
  4. 26

    Con xCode 6 y la introducción de @IBInspectable y @IBDesignable palabras clave es definitivamente posible y bastante simple. No hay necesidad de subclase/toma de nada.

    Usted puede hacer una extensión (categoría) para NSLayoutConstraint con el siguiente código (swift):

    extension NSLayoutConstraint {
    
        @IBInspectable var preciseConstant: Int {
            get {
                return Int(constant * UIScreen.mainScreen().scale)
            }
            set {
                constant = CGFloat(newValue) / UIScreen.mainScreen().scale
            }
        }
    }

    Entonces usted puede elegir necesario restricción en el IB.

    ¿Cómo puedo crear una 1px línea en el Interface Builder?

    Ir a sus propiedades y establecer el valor.

    ¿Cómo puedo crear una 1px línea en el Interface Builder?

    En el caso anterior, se emitirá una opinión con 1 px de altura en 1x, 2x y 3x dispositivos.

    • Esto es genial. Pero en lugar oscuro que ahora tiene dos competidores campos de la especificación de la real constant campo. Se garantiza que el «Preciso de la Constante» siempre gana a partir de la Constante real? Ahora y en el futuro? He tenido mi parte de los errores que se originan en el cambio de orden de ejecución entre las versiones X e y…
    • Así, mientras @IBInspectable es un simple contenedor Definido por el Usuario en tiempo de ejecución Atributos espero que no habrá ningún problema con eso, debido a que siempre se establecen en awakeFromNib() después de la primera carga de la vista uso de setValue:forKeyPath: (apple doc)
  5. 13

    En Swift:

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

    EDIT: Esta respuesta era para @2x sólo los dispositivos. En ese momento @3x aún no estaba en el mercado!!!!

    Hoy en día, @mdvs‘s respuesta parece ser la más limpia.


    Hacer 1px línea en IB es difícil, incluso para la retina-sólo los dispositivos. Finalmente he conseguido mediante el User Defined Runtime Attributes.

    Aquí está una captura de pantalla para el ajuste de la Altura de la Restricción a 0,5 px (que es 1px en la retina de los dispositivos).

    ¿Cómo puedo crear una 1px línea en el Interface Builder?

    • De esta forma se rompe en el iPhone 6 Plus.
    • Mala idea, de hecho, para codificar este.
    • Fue significado para los tiempos antes de iP6 generación ha sido anunciado. Definitivamente obsoleto ahora.
  7. 4

    Basa en @Nevs12 ‘s respuesta y comentarios, creo que tiene más sentido utilizar tal cosa:

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

    Parece que no es posible, uno debe hacerlo mediante programación o crear una vista personalizada.

    • Creo que es posible hacerlo IB-por favor, sólo ver mi respuesta
  9. 1

    Usted puede hacerlo en .xib archivo. Acaba de editar como texto y establezca constante=»0.5″ en lugar de «1» en la vista de la altura de la restricción de la

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

    En El Interface Builder

Dejar respuesta

Please enter your comment!
Please enter your name here