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!
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:
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];
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
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é.
- (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;
}
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.
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.
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
}