Actualmente estoy usando un JASidePanel para mi aplicación y tengo un UITableViewcontroller con un UIRefreshControl como uno de los ViewControllers para ello. El ancho de mi en formato tableview todavía tiene un ancho de 320 píxeles por lo que el UIRefreshControl obtiene centrado justo en el medio de la vista. Estoy tratando de averiguar si hay una manera de compensar la UIRefreshControl (moviendo la x 20 píxeles a la izquierda) para que quede centrada cuando la tengo a mi lado el panel visible.

Gracias!
La Compensación De UIRefreshControl

  • Hay una razón que usted no puede cambiar el marco de la vista de tabla?
  • Su coz he alternando los colores de las filas de modo que si alguien intenta mirar por debajo del panel lateral, se ve incompleto 🙁
  • Usted puede tratar de añadir una traducción de transformación para el control de la actualización con una ‘x’ movimiento igual a la anchura de su panel lateral.
  • Esa es una idea interesante. No estoy seguro de si va a funcionar, pero voy a tryi t.
  • Nope no funciona.
  • hola @user754905 ¿has probado a continuación las respuestas
  • Su cosa funciona. Solo estoy probando un par de cosas (ya que esta solución es un poco chapucero.) y se recompensa la recompensa cuando puedo, que es de 18 horas si todo va bien 🙂

InformationsquelleAutor user754905 | 2013-06-25

8 Comentarios

  1. 33

    Que usted necesita para establecer el marco de la UIRefreshControl. El uso de 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); 

    De salida:

    La Compensación De UIRefreshControl

    • Impresionante la punta. Aunque FYI para iOS 7 es 10 puntos menos (es decir, a la izquierda). Así: [[refContr.subvistas objectAtIndex:0] setFrame:CGRectMake(20, 0, 20, 30)];
    • UIRefreshControl no está destinado a ser agregado como una subvista… en mi experiencia, hacerlo, no causar accidentes cuando el objetivo no se ha quitado… UIRefreshControl puede causar otros problemas cuando se añade como una subvista
    • Se cambia el marco de la primera UIRefreshControl subvista hace el truco. Estoy usando SWRevealViewController y que funciona: - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; CGFloat rearPanelWidth = self.revealViewController.rearViewRevealWidth; UIView *refreshView = self.refreshControl.subviews[0]; CGRect refreshFrame = refreshView.frame; refreshFrame.size.width = rearPanelWidth; refreshView.frame = refreshFrame; }
  2. 58

    Trate de la edición de la 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];
    • puedo confirmar esto funciona, la solución más sencilla y
    • Funciona a la perfección!
    • Esta es una rápida y sencilla solución que la que aceptó la respuesta, pero me gustaría tener la aceptó contestar si me gustaría que mi UIRefreshControl un poco más personalizado. Personalmente, estoy utilizando esta solución.
    • puede alguien explicar por qué la configuración de -50 a origen y se mueve hacia abajo por 50 puntos?
    • Lucas: origen 0,0 en la esquina inferior izquierda.. el más pequeño es el número, menor es la posición.
    • Usted también puede usar refreshControl.bounds = CGRectOffset(refreshControl.bounds, 0, 50)
    • Para mí, es de 50 no -50.
    • Perfectamente resuelto mi problema. Gracias!

  3. 13

    Necesitaba hacer esto con el fin de mover el UIRefreshControl hacia abajo. Mi solución fue subclase UIRefreshControl, y sobrescribir el layoutSubviews método para establecer un CAAffineTransform de traducción en cada subvista. Desafortunadamente, usted no puede simplemente establecer una transformación en la UIRefreshControl.

    Cambio xOffset y yOffset como sea necesario.

    @interface MyUIRefreshControl : UIRefreshControl
    @end
    
    @implementation MyUIRefreshControl
    
    - (void)layoutSubviews {
        [super layoutSubviews];
        for (UIView *view in self.subviews) {
            view.transform = CGAffineTransformMakeTranslation(xOffset, yOffset);
        }
    }
    
    @end
  4. 4

    UIRefreshControl‘s marco se gestionan automáticamente así que tratando de cambiar su posición es probable que el rendimiento en resultados inesperados (especialmente entre iOS SDK de versiones). Como hemos señalado, el control siempre está centrado horizontalmente en superview del marco. Sabiendo esto se puede «aprovechar» de la situación por la compensación de superview.

    En su caso, establezca la tabla de la vista del marco CGRect(-40, 0, 360, superViewHight). Esto hará que su vista de la mesa para sentarse 40 puntos a la izquierda de la ventana. Así que usted tendrá que ajustar la vista de la tabla de contenido de modo que se sienta 40 puntos a la derecha o simplemente se extiende un extra de 40 puntos, pero las cosas representación fuera de la pantalla debe ser de relleno.

    Una vez que usted haga de este su UIRefreshControl se sentará 20 puntos a la izquierda de el deseo por el hecho de que esté centrada.

    La Compensación De UIRefreshControl

    • Gracias Chris, por desgracia no me puedo mover de la mesa porque tengo la alternancia de colores filas y hace que este se ven feos cuando el usuario mira en el sidepanel.
    • Seguro que no entiendo por qué un desplazamiento horizontal afectaría filas alternas que se disponen verticalmente?
    • Ah lo siento, no he leído la respuesta correctamente. Esto podría funcionar, pero la subvistas va a ser un dolor para obtener el derecho.
    • Chris, tendría sentido crear un invisible subvista (de su superview que actualmente contiene el refreshcontrol), a continuación, agregue el control de la actualización para que)? Esto proporcionaría un punto de vista que podría ser manipulado, sin complicar el diseño existente de cosas. [Me topé con esta respuesta y en realidad no tienen esta situación, por lo que no es cierto que he pensado en esto.]
    • ¡Uf, no tengo idea en este punto 😅
  5. 1

    Para Swift 2.2 solución 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 todo.

  6. 1
    - (UIRefreshControl *)refreshControl
    {
        if (!_refreshControl)
        {
            _refreshControl = [UIRefreshControl new];
            _refreshControl.tintColor = [UIColor lightGrayColor];

    _refreshControl.límites = CGRectInset(_refreshControl.límites, 0.0, 10.0); //vamos hacia abajo con un recuadro de 10.0

            [_refreshControl addTarget:self
                                action:@selector(pullToRefresh)
                      forControlEvents:UIControlEventValueChanged];
        }
        return _refreshControl;
    }
    • [auto.refreshControl beginRefreshing]; poner en viewWillAppear para comenzar la animación
  7. 0

    Aquí un Swift versión similar a la solución que Licántropo sugerido. Estoy usando mi propio personalizado de la actividad de la clase view (MyCustomActivityIndicatorView) y es también una subvista de la de control de la actualización, así que asegúrese de que no me lío con lo del marco, justo el marco de la predeterminada subvistas. Después de llamar a layoutSubviews en el super me ajustar la actividad personalizada de vista del marco para que coincida con. Todo esto está contenido en una costumbre UIRefreshControl subclase.

    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: voy a agregar en el UIView los márgenes de diseño en el que no es estrictamente necesario, pero le da a mi indicador de actividad de un poco de espacio para respirar.

  8. 0

    Deberá subclase UIScrollView, de código siguiente se ajustará UIRefreshControl ubicación basada en contentInset (sólo funciona para el desplazamiento vertical, pero fácilmente adoptables horizontal)

    override public func layoutSubviews() {
        super.layoutSubviews()
        guard let refreshControl = self.refreshControl else { return }
    
        var newFrame = refreshControl.frame
    
        if contentInset.top > .zero {
            let yOffset = abs(contentInset.top + contentOffset.y)
    
            newFrame.origin.y = -contentInset.top - yOffset
            newFrame.size.height = yOffset
        }
    
        guard newFrame != refreshControl.frame else { return }
        refreshControl.frame = newFrame
    }

Dejar respuesta

Please enter your comment!
Please enter your name here