web-dev-qa-db-fra.com

Compensation UIRefreshControl

J'utilise actuellement un JASidePanel pour mon application et j'ai un UITableViewcontroller avec un UIRefreshControl comme l'un des ViewControllers pour cela. La largeur de ma vue de table a toujours une largeur de 320 pixels, de sorte que l'UIRefreshControl est centré en plein milieu de la vue. J'essaie de comprendre s'il existe un moyen de compenser l'UIRefreshControl (en déplaçant le x de 20 pixels vers la gauche) afin qu'il semble centré lorsque mon panneau latéral est visible.

Merci! JASidePanel

27
user754905

Vous devez définir le cadre du UIRefreshControl. Utilisez ce code

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); 

Production:
Output

33
Warewolf

Essayez de modifier le bounds. Par exemple, pour déplacer le contrôle vers le bas + 50 px:

refreshControl.bounds = CGRectMake(refreshControl.bounds.Origin.x,
                                   -50,
                                   refreshControl.bounds.size.width,
                                   refreshControl.bounds.size.height);
[refreshControl beginRefreshing];
[refreshControl endRefreshing];
58
user1195202

J'avais besoin de le faire pour déplacer l'UIRefreshControl vers le bas. Ma solution a été de sous-classer UIRefreshControl et d'écraser la méthode layoutSubviews pour définir une traduction CAAffineTransform sur chaque sous-vue. Malheureusement, vous ne pouvez pas simplement définir une transformation sur UIRefreshControl.

Modifiez xOffset et yOffset si nécessaire.

@interface MyUIRefreshControl : UIRefreshControl
@end

@implementation MyUIRefreshControl

- (void)layoutSubviews {
    [super layoutSubviews];
    for (UIView *view in self.subviews) {
        view.transform = CGAffineTransformMakeTranslation(xOffset, yOffset);
    }
}

@end
13
stu

Le cadre de UIRefreshControl est automatiquement géré, donc essayer de changer sa position donnera probablement des résultats inattendus (en particulier entre les versions du SDK iOS). Comme vous l'avez noté, le contrôle est toujours centré horizontalement dans son cadre de superview. Sachant cela, vous pouvez "profiter" de la situation en compensant votre superview.

Dans votre cas, définissez le cadre de votre vue de table sur CGRect(-40, 0, 360, superViewHight). Cela entraînera votre vue de table à 40 points à gauche de la fenêtre. Vous devrez donc ajuster le contenu de votre vue de table en conséquence afin qu'il se trouve à 40 points vers la droite ou qu'il s'étende simplement de 40 points supplémentaires, mais le rendu de l'écran devrait être un remplissage.

Une fois que vous faites cela, votre UIRefreshControl sera assis 20 points vers la gauche comme vous le souhaitez, car il est centré.

enter image description here

4
Chris Wagner
- (UIRefreshControl *)refreshControl
{
    if (!_refreshControl)
    {
        _refreshControl = [UIRefreshControl new];
        _refreshControl.tintColor = [UIColor lightGrayColor];

_refreshControl.bounds = CGRectInset (_refreshControl.bounds, 0.0, 10.0); // laisser tomber avec l'encart 10.

        [_refreshControl addTarget:self
                            action:@selector(pullToRefresh)
                  forControlEvents:UIControlEventValueChanged];
    }
    return _refreshControl;
}
1
Georgy Brusnikin

Pour Swift 2.2 solution est

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)

C'est tout.

1
muhasturk

Voici une version Swift similaire à la solution de contournement suggérée par Werewolf. J'utilise ma propre classe de vue d'activité personnalisée (MyCustomActivityIndicatorView) et c'est également une sous-vue du contrôle d'actualisation, donc Je m'assure de ne pas jouer avec son cadre, juste le cadre des sous-vues par défaut. Après avoir appelé layoutSubviews sur super, j'ajuste le cadre de la vue d'activité personnalisée pour qu'il corresponde. Tout cela est contenu dans un UIRefreshControl sous-classe.

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
}

Remarque: j'ajoute dans les marges de mise en page d'UIView ce qui n'est pas strictement nécessaire mais donne à mon indicateur d'activité un peu d'espace pour respirer.

0
Ben Lachman

Vous devez sous-classer UIScrollView, le code suivant ajustera l'emplacement UIRefreshControl en fonction de contentInset (fonctionne uniquement pour le défilement vertical mais facilement adoptable pour l'horizontale)

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
}
0
Aleksey Mazurenko