ios - Compensación de UIRefreshControl
ios6 (7)
Aquí hay una versión de Swift similar a la solución alternativa sugerida por Werewolf. Estoy usando mi propia clase de vista de actividad personalizada ( MyCustomActivityIndicatorView
) y también es una subvista del control de actualización, por lo que me aseguro de no interferir con su marco, solo el marco de las subvistas por defecto. Después de llamar a layoutSubviews
en super, ajusto el marco de la vista de actividad personalizada para que coincida. Todo esto está contenido en una subclase UIRefreshControl
personalizada.
override func layoutSubviews() {
for view in subviews {
if view is MyCustomActivityIndicatorView {
continue
} else {
// UIRefreshControl sizes itself based on the size of it''s subviews. Since you can''t remove the default refresh indicator, we modify it''s frame to match our activity indicator before calling layoutSubviews on super
var subFrame = view.frame
subFrame.size = activityView.intrinsicContentSize()
// add some margins
subFrame.offsetInPlace(dx: -layoutMargins.left, dy: -layoutMargins.top)
subFrame.insetInPlace(dx: -(layoutMargins.left+layoutMargins.right), dy: -(layoutMargins.top+layoutMargins.bottom))
view.frame = subFrame.integral
}
}
super.layoutSubviews()
activityView.frame = bounds
}
Nota: Estoy agregando márgenes de diseño de UIView en los que no es estrictamente necesario, pero le da a mi indicador de actividad un espacio para respirar.
Actualmente estoy usando un JASidePanel para mi aplicación y tengo un UITableViewcontroller con un UIRefreshControl como uno de los ViewControllers para él. El ancho de mi tabla todavía tiene un ancho de 320 píxeles, por lo que UIRefreshControl se centra en el centro de la vista. Estoy tratando de averiguar si hay una manera de compensar el UIRefreshControl (moviendo la x por 20 píxeles hacia la izquierda) para que se vea centrada cuando tenga mi panel lateral visible.
¡Gracias!
El marco de UIRefreshControl
se gestiona automáticamente, por lo que intentar cambiar su posición probablemente ceda en resultados inesperados (especialmente entre las versiones de iOS SDK). Como habrás notado, el control siempre se centra horizontalmente en el marco de la supervista. Sabiendo esto, puedes ''aprovechar'' la situación al contrarrestar tu super visión.
En su caso, configure el marco de su vista de tabla en CGRect(-40, 0, 360, superViewHight)
. Esto hará que su vista de tabla se siente 40 puntos a la izquierda de la ventana. Por lo tanto, deberá ajustar el contenido de la vista de tabla en consecuencia para que quede a 40 puntos hacia la derecha o simplemente amplíe 40 puntos adicionales, pero el procesamiento de procesamiento de la pantalla debe estar relleno.
Una vez que hagas esto, tu UIRefreshControl
se sentará 20 puntos a la izquierda como desees debido al hecho de que está centrado.
Intenta editar los bounds
. Por ejemplo, para mover el control hacia abajo + 50px:
refreshControl.bounds = CGRectMake(refreshControl.bounds.origin.x,
-50,
refreshControl.bounds.size.width,
refreshControl.bounds.size.height);
[refreshControl beginRefreshing];
[refreshControl endRefreshing];
Necesitaba hacer esto para mover el UIRefreshControl hacia abajo. Mi solución fue subclase UIRefreshControl y sobrescribir el método layoutSubviews para establecer una traducción CAAffineTransform en cada subvista. Desafortunadamente no puedes simplemente configurar una transformación en UIRefreshControl.
Cambie xOffset y yOffset según sea necesario.
@interface MyUIRefreshControl : UIRefreshControl
@end
@implementation MyUIRefreshControl
- (void)layoutSubviews {
[super layoutSubviews];
for (UIView *view in self.subviews) {
view.transform = CGAffineTransformMakeTranslation(xOffset, yOffset);
}
}
@end
Para la solución Swift 2.2 es
let offset = -50
let refreshControl = UIRefreshControl()
refreshControl.bounds = CGRect(x: refreshControl.bounds.origin.x, y: offset,
width: refreshControl.bounds.size.width,
height: refreshControl.bounds.size.height)
refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
refreshControl.addTarget(self, action: #selector(networking), forControlEvents: UIControlEvents.ValueChanged)
self.profileTable.addSubview(refreshControl)
Eso es.
Necesita establecer el marco de UIRefreshControl
. Usa este código
UIRefreshControl *refContr=[[UIRefreshControl alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
[refContr setTintColor:[UIColor blueColor]];
[refContr setBackgroundColor:[UIColor greenColor]];
[stocktable addSubview:refContr];
[refContr setAutoresizingMask:(UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleLeftMargin)];
[[refContr.subviews objectAtIndex:0] setFrame:CGRectMake(30, 0, 20, 30)];
NSLog(@"subViews %@",refContr.subviews);
- (UIRefreshControl *)refreshControl
{
if (!_refreshControl)
{
_refreshControl = [UIRefreshControl new];
_refreshControl.tintColor = [UIColor lightGrayColor];
_refreshControl.bounds = CGRectInset (_refreshControl.bounds, 0.0, 10.0); // defraudarlo con el recuadro 10.0
[_refreshControl addTarget:self
action:@selector(pullToRefresh)
forControlEvents:UIControlEventValueChanged];
}
return _refreshControl;
}