ios - razon - rotacion de cuentas por pagar
¿Cómo colocar el indicador de actividad en el centro de su supervisión con Programación automática? (4)
Centré mi indicador de actividad en su supervisión, agregándolo en Interface Builder con un alfa de cero (y un IBOutlet para él en mi clase de controlador de vista). Luego agregué restricciones para centrarlo en los ejes X e Y. Finalmente, le agregué restricciones de ancho y altura para silenciar un error de reproducción automática.
En mi vista, el método startActivityIndicator del controlador, configuré el alfa del indicador de actividad en uno y llamé al método startAnimating. En mi método stopActivityIndicator, llamo al método stopAnimating y pongo el alfa del indicador de actividad a cero.
Por qué el siguiente código no funciona para posicionar el indicador de actividad en el centro de su supervisión:
UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc]
initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
[self.mysuperview addSubview:activityIndicator];
[activityIndicator addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"|-(>=20)-[view(==100)]-(>=20)-|"
options:NSLayoutFormatAlignAllCenterX | NSLayoutFormatAlignAllCenterY
metrics:nil
views:@{@"view" : self.mysuperview}]];
El indicador de actividad está ubicado en algún lugar en la esquina superior izquierda, definitivamente no en el centro.
================== Actualización: SOLUCIÓN ENCONTRADA: Tengo que desactivar las restricciones de tamaño automático después de crear el indicador y luego todas las soluciones que funcionaron:
[activityIndicator setTranslatesAutoresizingMaskIntoConstraints:NO];
Lo encontré en el enlace dado por @Vignesh, así que acepto su respuesta.
Está cumpliendo con sus requisitos al estar en la esquina, ya que no está diciendo que las brechas en cada lado tienen que ser iguales. Intenta esto en su lugar:
[self.superview addConstraint:[NSLayoutConstraint constraintWithItem:activityIndicator
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:self.superview
attribute:NSLayoutAttributeCenterX
multiplier:1.0
constant:0.0]];
Y para centrarlo verticalmente haz esto también:
[self.superview addConstraint:[NSLayoutConstraint constraintWithItem:activityIndicator
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:self.superview
attribute:NSLayoutAttributeCenterY
multiplier:1.0
constant:0.0]];
Alternativamente, recomiendo usar el proyecto FLKAutoLayout para simplificar todo esto:
github.com/dkduck/FLKAutoLayout
Entonces puedes hacer:
[activityIndicator alignCenterXWithView:self.superview predicate:nil];
[activityIndicator alignCenterYWithView:self.superview predicate:nil];
Lo cual es bueno :)
Los siguientes cuatro ejemplos de código de Swift 3 muestran cómo centrar un UIActivityIndicatorView
en el UIView
de un UIViewController
con diseño automático .
Todas las muestras producen el mismo resultado pero, según sus necesidades y gustos, puede elegir uno u otro.
Si la vista de UIActivityIndicatorView
de UIActivityIndicatorView no es una self.view
, simplemente tiene que reemplazar cada llamada de self.view
uno self.view
con su propia vista de superview
(sin superview
).
1. NSLayoutConstraint
style
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let indicatorView = UIActivityIndicatorView(activityIndicatorStyle: .gray)
indicatorView.isHidden = false
indicatorView.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(indicatorView)
// Auto layout
let horizontalConstraint = NSLayoutConstraint(item: indicatorView,
attribute: .centerX,
relatedBy: .equal,
toItem: self.view,
attribute: .centerX,
multiplier: 1,
constant: 0)
let verticalConstraint = NSLayoutConstraint(item: indicatorView,
attribute: .centerY,
relatedBy: .equal,
toItem: self.view,
attribute: .centerY,
multiplier: 1,
constant: 0)
NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint])
/*
// You can replace NSLayoutConstraint activate(_:) call with the following lines:
self.view.addConstraint(horizontalConstraint)
self.view.addConstraint(verticalConstraint)
*/
}
}
2. UIViewAutoresizing
estilo
Los resortes y puntales se traducirán en las restricciones de diseño automático correspondientes en el tiempo de ejecución.
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let indicatorView = UIActivityIndicatorView(activityIndicatorStyle: .gray)
indicatorView.isHidden = false
indicatorView.translatesAutoresizingMaskIntoConstraints = true // default is true
self.view.addSubview(indicatorView)
// Springs and struts
indicatorView.center = CGPoint(x: self.view.bounds.midX, y: self.view.bounds.midY)
indicatorView.autoresizingMask = [
.flexibleLeftMargin,
.flexibleRightMargin,
.flexibleTopMargin,
.flexibleBottomMargin
]
}
}
3. Estilo de lenguaje de formato visual
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let indicatorView = UIActivityIndicatorView(activityIndicatorStyle: .gray)
indicatorView.isHidden = false
indicatorView.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(indicatorView)
// Auto layout
let views: [String: Any] = ["superview": self.view, "indicatorView": indicatorView]
let horizontalConstraints = NSLayoutConstraint
.constraints(withVisualFormat: "H:[superview]-(<=0)-[indicatorView]",
options: .alignAllCenterY,
metrics: nil,
views: views)
let verticalConstraints = NSLayoutConstraint
.constraints(withVisualFormat: "V:[superview]-(<=0)-[indicatorView]",
options: .alignAllCenterX,
metrics: nil,
views: views)
self.view.addConstraints(horizontalConstraints)
self.view.addConstraints(verticalConstraints)
}
}
4. Estilo NSLayoutAnchor
(requiere iOS 9)
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let indicatorView = UIActivityIndicatorView(activityIndicatorStyle: .gray)
indicatorView.isHidden = false
indicatorView.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(indicatorView)
// Auto layout
let horizontalConstraint = indicatorView
.centerXAnchor.constraint(equalTo: self.view.centerXAnchor)
let verticalConstraint = indicatorView
.centerYAnchor.constraint(equalTo: self.view.centerYAnchor)
NSLayoutConstraint.activate([horizontalConstraint, verticalConstraint])
/*
// You can replace NSLayoutConstraint activate(_:) call with the following lines:
self.view.addConstraint(horizontalConstraint)
self.view.addConstraint(verticalConstraint)
*/
}
}
Puedes probar esto,
UIView *superview = self.mysuperview;
NSDictionary *variables = NSDictionaryOfVariableBindings(activityIndicator, superview);
NSArray *constraints =
[NSLayoutConstraint constraintsWithVisualFormat:@"V:[superview]-(<=1)-[activityIndicator]"
options: NSLayoutFormatAlignAllCenterX
metrics:nil
views:variables];
[self.view addConstraints:constraints];
constraints =
[NSLayoutConstraint constraintsWithVisualFormat:@"H:[superview]-(<=1)-[activityIndicator]"
options: NSLayoutFormatAlignAllCenterY
metrics:nil
views:variables];
[self.view addConstraints:constraints];
Tomado de here .