Xamarin iOS Autolayout: Redimensiona el ancho y el desplazamiento vertical de forma automática para varios dispositivos mientras mantiene el desplazamiento horizontal desactivado
xamarin.ios (3)
1.Añada restricciones iniciales, finales, superiores e inferiores en scrollView a su vista.
2. Agregue UIView como containerView of scrollview y agregue 6 Restricciones de containerView a scrollview como se muestra a continuación.
a) Líder b) final c) superior d) inferior e) Centrar horizontalmente.
3. Asegúrese de que los elementos superiores en la vista de contenedor se unan a la parte superior agregando restricciones superiores y también unir el elemento más inferior al fondo de la vista de contenedor agregando restricciones de fondo. Y también todos los elementos entre arriba y abajo en la vista de contenedor deben estar verticalmente conectados entre sí, por lo que definirá el tamaño del contenido de la vista del contenedor.
definirá la altura del contenido real para scrollview. y finalmente defina el tamaño del contenido para scrollview en el código.
Quiero crear una página que tenga un desplazamiento vertical pero no horizontal. Debe ajustar el ancho del contenido y desplazamiento vertical automáticamente según el tamaño de pantalla.
Algo similar a esto:
No puedo usar UITableView ya que mi página puede no tener necesariamente elementos homogéneos. Podría tener una combinación de campos de texto, menú desplegable, etc.
En un procesador personalizado para Xamarin.Forms escribí mi UITableViewController así:
_controller = new InfoFieldItemsTableViewController();
_controller.TableView.SeparatorStyle = UITableViewCellSeparatorStyle.None;
_controller.TableView.SeparatorColor = UIColor.Clear;
_controller.TableView.AllowsSelection = false;
// http://useyourloaf.com/blog/self-sizing-table-view-cells/
_controller.TableView.RowHeight = UITableView.AutomaticDimension;
En mi controlador, estoy haciendo esto para registrar todos los posibles candidatos de celda:
private void RegisterCells()
{
foreach (var tuple in InfoFieldCellMapping.Map)
{
this.TableView.RegisterNibForCellReuse(tuple.Value.Item1, tuple.Value.Item2);
}
}
public override void ViewDidLoad()
{
RegisterCells();
base.ViewDidLoad();
}
Estoy haciendo esto en mi controlador para que las células cambien de tamaño según la altura que necesiten:
public override nfloat EstimatedHeight(UITableView tableView, NSIndexPath indexPath)
{
return 100;
}
Ahora todo lo que necesita hacer es crear archivos de celda dentro de su IDE, que deberían ser archivos .xib y diseñarlos en el editor usando el autolayout (para que puedan adaptarse a los cambios de orientación automáticamente).
Dentro de su fuente de datos de TableViews todo lo que queda por hacer es mapear entre su elemento de datos y su celda correspondiente similar a:
public override UICollectionViewCell GetCell(UICollectionView collectionView, NSIndexPath indexPath)
{
var dataItem = Items[indexPath.Row];
var key = ""; // use info from data item to figure out which key identifies your table cell to dequeue the correct kind of cell
var cell = collectionView.DequeueReusableCell(key, indexPath) as UICollectionViewCell;
}
Eso es todo lo que necesitas realmente. En mi escenario estoy mapeando campos que pueden contener diferentes controles para entradas de fecha, entradas de números, textos largos, textos cortos, etc.
Espero que eso ayude
Como mencioné aquí .
Consulte los pasos 1 y 2, establezca las restricciones en Scrollview
y containerView
.
Scrollview
el margen entre Scrollview
y View
, y agrego algunos controles en el containerView
, por lo que se ve así:
darse cuenta
Dado que establecemos el ancho de la vista de contenedor igual al ancho de la vista de desplazamiento, el ancho es fijo, por lo que podemos desplazar verticalmente no horizontalmente.
La altura de los controles y espacios entre ellos debe establecerse claramente, porque el contentSize se calcula automáticamente al sumarlos. (
If contentSize is greater than the height of screen ,the scrollview can be scrolled
)
Vi que estableces esas restricciones en los controles, pero no puedes desplazarte hacia abajo para ver los controles fuera de la pantalla, creo que te falta establecer el margen inferior en el último control (el más bajo).
Hagamos una prueba.
1. Establecemos el margen (entre el botón y el campo de texto) en 1000 y no establecemos el margen inferior entre el campo de texto y containerView.
Resultado: no se puede desplazar hacia abajo para ver el campo de texto fuera de la pantalla.