El ancho de diseño máximo preferido automático no está disponible en versiones de iOS anteriores a 8.0

322

Abrí un proyecto iOS existente con Xcode6 beta6, y Xcode enumera la siguiente advertencia para los archivos Storyboard y Xib:

El ancho de diseño máximo preferido automático no está disponible en versiones de iOS anteriores a 8.0

Intenté abordar la advertencia estableciendo el ancho como explícito como a continuación:

Sin embargo, esto no resolvió las advertencias. ¿Cómo se pueden eliminar?

mononucleosis infecciosa
fuente
3
Estoy usando XCode 6.1 y actualicé todas mis etiquetas a Ancho preferido = Explícito. Esto resolvió el problema para mí.
djburdick

Respuestas:

373

Actualización 3:
esta advertencia también puede ser activada por etiquetas que se han numberOfLinesestablecido en cualquier cosa menos 1 si su objetivo de implementación se establece en 7.1. Esto es completamente reproducible con el nuevo proyecto de vista única.

Pasos para reproducir:

  1. Cree un nuevo proyecto de vista única, objetivo-c
  2. Establezca el objetivo de implementación en 7.1
  3. Abra el guión gráfico del proyecto.
  4. Coloque una etiqueta en el controlador de vista proporcionado
  5. Establezca el número de líneas para esa etiqueta en 2.
  6. Compilar

He archivado el siguiente radar:
rdar: // problem / 18700567

Actualización 2:
Desafortunadamente, esto es algo nuevo en la versión de lanzamiento de Xcode 6. Tenga en cuenta que, en su mayor parte, puede editar manualmente su storyboard / xib para solucionar el problema. Por Charles A. en los comentarios a continuación:

Vale la pena mencionar que puede introducir esta advertencia por accidente de forma bastante fácil, y la advertencia en sí misma no ayuda a encontrar la etiqueta que es la culpable. Esto es lamentable en un guión gráfico complejo. Puede abrir el guión gráfico como un archivo fuente y buscar con la expresión regular <label(?!.*preferredMaxLayoutWidth)para encontrar etiquetas que omitan un atributo / valor preferido de MaxLayoutWidth. Si agrega PreferredMaxLayoutWidth = "0" en dichas líneas, es lo mismo que marcar explícitamente y establecer el valor 0.

Actualización 1:
Este error ahora se ha corregido en Xcode 6 GM.

Respuesta original
Este es un error en Xcode6-Beta6 y XCode6-Beta7 y puede ignorarse de forma segura por ahora.

Un ingeniero de Apple en los foros de desarrolladores de Apple tenía esto que decir sobre el error:

El ancho de diseño máximo preferido es una propiedad de diseño automático en UILabel que le permite crecer automáticamente verticalmente para adaptarse a su contenido. Las versiones de Xcode anteriores a 6.0 establecerían PreferredMaxLayoutWidth para etiquetas multilínea al tamaño de los límites actuales en tiempo de diseño. Tendría que actualizar manualmente PreferredMaxLayoutWidth en tiempo de ejecución si su diseño horizontal cambiara.

iOS 8 agregó soporte para computar automáticamente el PreferredMaxLayoutWidth en tiempo de ejecución, lo que facilita aún más la creación de etiquetas multilínea. Esta configuración no es retrocompatible con iOS 7. Para admitir tanto iOS 7 como iOS 8, Xcode 6 le permite elegir "Automático" o "Explícito" para PreferredMaxLayoutWidth en el inspector de tamaño. Debieras:

Elija "Automático" si apunta a iOS 8 para obtener la mejor experiencia. Elija "Explícito" si apunta a <iOS 8. Luego, puede ingresar el valor de PreferMaxLayoutWidth que desea establecer. La activación de valores "explícitos" se ajusta al tamaño de los límites actuales en el momento en que marcó la casilla.

La advertencia aparecerá si (1) está usando el diseño automático, (2) "Automático" está configurado para una etiqueta multilínea [puede verificar esto en el inspector de tamaño de la etiqueta], y (3) su objetivo de implementación <iOS 8)

Parece que el error es que esta advertencia aparece para documentos que no son de auto-distribución. Si ve esta advertencia y no utiliza el diseño automático, puede ignorarla.

Alternativamente, puede solucionar el problema utilizando el inspector de archivos en el guión gráfico o xib en cuestión y cambiar "Compilaciones para" a "Compilaciones para iOS 8.0 y versiones posteriores" Inspector de archivos Xcode

memmons
fuente
15
Vale la pena mencionar que puede introducir esta advertencia por accidente de forma bastante fácil, y la advertencia en sí misma no ayuda a encontrar la etiqueta que es la culpable. Esto es lamentable en un guión gráfico complejo. Puede abrir el guión gráfico como un archivo fuente y buscar con la expresión regular <label(?!.*preferredMaxLayoutWidth)para encontrar etiquetas que omitan un preferredMaxLayoutWidthatributo / valor. Si agrega en preferredMaxLayoutWidth="0"tales líneas, es lo mismo que marcar explícitamente y establecer el valor 0.
Charles A.
66
¿Hay alguna forma programática para configurar un UILabel para ajustar automáticamente el PreferredMaxLayoutWidth, sin subclasificarlo o implementarlo en algún lugar en layoutSubviews? Si este es un comportamiento que IB puede habilitar, eso sugiere que hay una propiedad o valor mágico que se puede establecer. Pero nada en los documentos de API o encabezados dice eso.
alga
2
@CharlesA. He estado probando con un proyecto vacío y encontré otro atributo de etiqueta que activará esta advertencia: si numberOfLinesse establece en cualquier cosa menos 1, la advertencia sucederá independientemente de si se ha preferredMaxLayoutWidthconfigurado o no.
memmons
2
@ MichaelG.Emmons Extraño, no puedo reproducir esto con un proyecto limpio y un objetivo de implementación establecido en 7.1. Una vez que establezco el preferredMaxLayoutWidth0 explícito, la advertencia desaparece independientemente del numberOfLinesvalor. ¿Pero tal vez esto se solucionó en la actualización de Xcode esta mañana?
Charles A.
2
Entonces ... ¿es la única solución para establecer el número de líneas en 1 y cambiarlo del código? esto no parece profesional
jomafer
315

Para encontrar la (s) etiqueta (s) del problema en un guión gráfico grande, siga mis pasos a continuación.

  1. En el Navegador de problemas de xCode, haga clic con el botón derecho en el error y seleccione "Revelar en el registro". (Nota: @Sam sugiere a continuación, busque en el navegador de informes de xCode . También @Rivera señala en los comentarios que "A partir de Xcode 6.1.1, al hacer clic en la advertencia se abrirá automáticamente y resaltará la etiqueta en conflicto". No he probado esto )

ingrese la descripción de la imagen aquí

  1. Esto mostrará el error con un código al final de su archivo de guión gráfico. Copie el valor después de .storyboard

ingrese la descripción de la imagen aquí

  1. A continuación, revele su guión gráfico como archivo fuente. ingrese la descripción de la imagen aquí

  2. Buscar. Debería poder saber qué etiqueta es desde aquí con bastante facilidad mirando el contenido. ingrese la descripción de la imagen aquí

Una vez que encuentre la etiqueta, la solución que funcionó para mí fue establecer el "ancho preferido" en 0.

ingrese la descripción de la imagen aquí

Por cierto, siempre puede obtener rápidamente la identificación de un elemento de la interfaz seleccionando el elemento y mirando debajo del inspector de identificación. Muy útil.

ingrese la descripción de la imagen aquí

smileBot
fuente
36
¡Esta debería ser la respuesta aceptada! Esto realmente resuelve el problema. Incluso ayuda a encontrar otros problemas en el Guión gráfico que no aparecen normalmente. Una cosa: encuentro que Report Navigator es mucho más confiable que hacer clic derecho en "Revelar en el registro"
Sam Spencer
1
Me encanta esta respuesta, muy simple y solucionó la advertencia. ¡Muchas gracias!
Ethan Parker el
1
Gracias soooo muchhhhhh :)
SR Nayak
2
¿Por qué establece el ancho preferido en cero en lugar del ancho que se muestra en el generador de interfaces?
Biclops
99
Respuesta impresionante! Puede buscar la identificación del objeto directamente desde la vista IB del Storyboard. Solo haz un Ctrl-f. No es necesario abrirlo como código fuente y luego volver a la vista IB para cambiar el ancho preferido.
AndroidDev
36

Puede solucionar este problema sin abrir el guión gráfico como fuente . UILabels activa esta advertencia si numberOfLines! = 1 y el objetivo de implementación es <8.0

¿CÓMO ENCONTRARLO?

  1. Vaya a Issue Navigator (CMD + 8) y seleccione la última versión construida con la advertencia ingrese la descripción de la imagen aquí
  2. Localice las advertencias ( busque " Disposición máxima preferida automática ") y presione el botón expandir a la derecha
    ingrese la descripción de la imagen aquí
  3. Encuentra el ID de objeto de UILabel ingrese la descripción de la imagen aquí
  4. Abra el Storyboard y SEARCH (CMD + f) para el objeto. Será seleccionar y resaltar la UILabel
  5. Establecer ancho preferido = 0 "explícito" como otros sugirieron
Tibidabo
fuente
23

La solución es bastante simple

Solo habilita Builds para iOS 8 y versiones posteriores

ingrese la descripción de la imagen aquí

Alejandro Luengo
fuente
Bastante simple y destructivo. Solo el 85% de los usuarios de iOS están en iOS8 + developer.apple.com/support/app-store
aryaxt el
66
@aryaxt Lamento decir que estás equivocado. Puede establecer un objetivo de implementación en la configuración del proyecto para iOS 7 o inferior y cambiar Compilaciones para documentos IB a iOS 8 y posterior y FUNCIONARÁ en iOS 7. Verifíquelo y elimine el voto negativo. Puedes consultarlo aquí developer.apple.com/library/ios/recipes/…
Alejandro Luengo
1
Como siempre, la mejor respuesta no es la aceptada ... :) ¡Salud!
HepaKKes
ACTUALIZACIÓN para iOS9.3 y versiones posteriores: los dispositivos iOS7 ya no representan guiones gráficos con la configuración anterior. Esto solía funcionar antes de la actualización 9.3. Parece que Apple cambió algo en su proceso automatizado de prelanzamiento.
pechar
4

Ahora mi versión de Xcode es 6.1. Pero también recibí esta advertencia. me molesta mucho después de buscar una y otra vez. Encontré la solución.

Motivo: debe haber configurado sus Líneas UILabel> 1 en su Guión gráfico.

Solución: establezca su atributo UILabel Lines en 1 en Storyboard. reinicia tu Xcode. Funciona para mí, espero que pueda ayudar a más personas.

Si realmente necesita mostrar sus palabras más de 1 línea. deberías hacerlo en el código.

//the words will show in UILabel
NSString *testString = @"Today I wanna set the line to multiple lines. bla bla ......  Today I wanna set the line to multiple lines. bla bla ......"
[self.UserNameLabel setNumberOfLines:0];
self.UserNameLabel.lineBreakMode = NSLineBreakByWordWrapping;
UIFont *font = [UIFont systemFontOfSize:12];
//Here I set the Label max width to 200, height to 60
CGSize size = CGSizeMake(200, 60);
CGRect labelRect = [testString boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName] context:nil];
self.UserNameLabel.frame = CGRectMake(self.UserNameLabel.frame.origin.x, self.UserNameLabel.frame.origin.y, labelRect.size.width, labelRect.size.height);
self.UserNameLabel.text = testString;
ronan
fuente
3
"Si realmente necesita mostrar sus palabras más de 1 línea, debe hacerlo en el código". Esto es un troll, ¿verdad?
webstersx
@webstersx creo que habla en serio
Jasper
4

Para resumir, para mí, siguiendo las dos instrucciones anteriores para cambiar cualquier instancia en la que numberOfLines = 0 a 1 o superior, y agregar manualmente PreferMaxLayoutWidth = "0" a cada instancia de una etiqueta dentro de la fuente del guión gráfico solucionó todas mis advertencias.

Lynn S
fuente
Amigo, eres un MAGO! Funciona incluso con un UIScrollerView como se esperaba. MEJOR SOLUCIÓN hasta ahora porque podría dejar el objetivo de implementación de mi Nib en iOS7.0
Yaro
3

Como no tengo 50 reputación, Stackoverflow no me deja comentar sobre la segunda mejor respuesta. Encontré otro truco para encontrar la etiqueta del culpable en el Storyboard.

Entonces, una vez que conozca la identificación de la etiqueta, abra su guión gráfico en una pestaña separada con los controladores de vista mostrados y simplemente ejecute el comando F y el comando V y lo llevará directamente a esa etiqueta :)

Junaid Ahmed
fuente
Te refieres a buscar en el proyecto la identificación de la etiqueta.
Borzh
2

Lo hice funcionar seleccionando el diseño original que tenía en la selección W / H. Storyboard funciona como se esperaba y el error desapareció.

También asegúrese de estar desarrollando para iOS 8.0. Verifique eso desde la configuración general del proyecto.

Aquí es donde debes presionar.

AarneHuttunen
fuente
1

Tuve este problema y pude solucionarlo agregando restricciones para determinar el máximo con una etiqueta.

Al colocar una etiqueta multilínea no hay ninguna restricción establecida para imponer el ancho dentro de la vista principal. Aquí es donde entra en juego el nuevo PreferredMaxWidth. En iOS 7 y versiones anteriores, debe definir el ancho máximo usted mismo. Simplemente agregué una restricción de 10px al lado izquierdo y derecho de la etiqueta.

También puede agregar una restricción de ancho <= que también soluciona el problema.

Entonces, esto no es realmente un error, simplemente debe definir el ancho máximo usted mismo. La opción explícita mencionada en otra respuesta también funcionará ya que está configurando este valor de ancho, sin embargo, tendrá que modificar este valor si desea que el ancho máximo cambie en función del ancho principal (ya que ha establecido explícitamente el ancho).

Mi solución anterior garantiza que el ancho siempre se mantenga sin importar cuán grande sea la vista principal.

Matthew Cawley
fuente
1

Por alguna razón, incluso si cambia el Objetivo de implementación de iOS a 8.0 o superior, los archivos Xib no adoptan ese cambio y permanecen con la configuración anterior en el inspector de archivos

Inspector de archivos en Xib después de cambiar el objetivo de implementación de iOS

Por lo tanto, debe cambiarlo manualmente para cada Xib Después del cambio manual

Una vez hecho esto, la advertencia desaparecerá :-)

Gutty1
fuente