2013-09-24 14 views
10

So che questo è già stato chiesto circa un centinaio di volte qui, ma non ho trovato una risposta adeguata nelle altre domande.UIProgressView personalizzato in iOS7 non è possibile?

Il mio problema è l'altezza del mio UIProgressView. Mentre tutto ha funzionato come previsto in iOS6, ora in iOS7 niente va bene.

ho provato la seguente:

  • 1. Attuazione del layout personalizzato nella drawRect-Metodo:

funziona come un fascino in iOS6, ma in iOS7 il progresso è impostata su 100% dall'inizio o il bar è molto sottile.

  • 2.Impostazione il layout con la proprietà progressImage e trackImage della comparsa UIProgressView

anche non lavorare sotto iOS7. Qui il progresso della barra è impostato anche al 100% dall'inizio. Alcune persone scrivono che dovrebbe essere possibile in questo modo, ma non posso confermarlo per iOS7.

  • 3.Using initWithProgressStyle per l'inizializzazione e quindi impostando la cornice della vista progresso
Non

lavorare per me sotto iOS6 e iOS7. In iOS7 le barre sono molto sottili.

Per ora è piuttosto frustrante perché le barre sono al 100% o sono mega-slim. Qualcuno può darmi un suggerimento per raggiungere il vecchio layout delle mie visualizzazioni di progresso. Penso che sia possibile perché se guardo la mia app Spotify sull'iPhone (iOS7 installato), la vista del progresso appare come prima.

enter image description here

La ringrazio molto!

+0

Sfortunatamente l'API iOS7 introduce molte limitazioni all'interfaccia utente e costringe gli sviluppatori a progettare le proprie app in modo che appaiano esattamente come le app di riserva. Addio alla creatività. La buona notizia è che puoi sempre scrivere le tue opinioni e creare i tuoi controlli e non limitarti a quelli standard. Solo più lavoro per noi. – Bms270

+3

lol @ "addio alla creatività" – dmur

+0

Direi "addio a ** originalità **", invece. Trovare un design visivo ideale per la tua app dalle linee guida vincolanti di iOS 7 è una forma di creatività secondo me. –

risposta

18

Beh, il problema è cuciture che iOS6 UIProgressView e iOS7 UIProgressView hanno diversa struttura subviews interna. La vista di avanzamento di iOS6 è una vista singola senza vista secondaria (o una vista secondaria), la vista di avanzamento di iOS7 ha poche visualizzazioni secondarie aggiuntive per disegnare la barra di avanzamento e lo sfondo.

Se si rimuove tutta la visualizzazione secondaria di UIProgressView su iOS7 rispetto a drawRect: il metodo funzionerà come in precedenza su iOS6, ma si avrà la totale responsabilità di disegnare il contenuto della visualizzazione di avanzamento, inclusa la barra di avanzamento e lo sfondo.

- (id) initWithCoder: (NSCoder*)aDecoder 
{ 
    if(self=[super initWithCoder: aDecoder]) 
    { 
      // Also you can setup height of your progress here 
      // self.frame = CGRectMake(0,0,100,yourHeight); 

     NSArray *subViews = self.subviews; 
     for(UIView *view in subViews) 
     { 
      [view removeFromSuperview]; 
     } 
    } 
    return self; 
} 
+1

Questo ha funzionato per me! Ho dovuto usare 'initWithFrame' anche se –

4

Ho fatto una specie di soluzione alternativa per questo problema. Spero che qualcuno possa dare una buona risposta per un normale UIProgressView.

Ho scritto una sottoclasse UIView con angoli arrotondati e una vista al suo interno che cambia le sue dimensioni a seconda del dato avanzamento. Io uso solo i colori per lo sfondo, ma anche le immagini sarebbero possibili. Here's il codice:

#import "CustomProgressView.h" 
#import <QuartzCore/QuartzCore.h> 

@interface CustomProgressView() 

@property (nonatomic, retain) UIView *progressView; 

@end 

@implementation CustomProgressView 

@synthesize progressColor,trackColor,progressView,progress; 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.layer.cornerRadius = 5; 
     // clipsToBounds is important to stop the progressView from covering the original view and its round corners 
     self.clipsToBounds = YES; 

     self.progressView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, frame.size.height)]; 
     [self addSubview:self.progressView]; 
    } 

    return self; 
} 

-(void)setProgressColor:(UIColor *)theProgressColor { 
    self.progressView.backgroundColor = theProgressColor; 
    progressColor = theProgressColor; 
} 

-(void)setTrackColor:(UIColor *)theTrackColor { 
    self.backgroundColor = theTrackColor; 
    trackColor = theTrackColor; 
} 

-(void)setProgress:(float)theProgress { 
    progress = theProgress; 
    CGRect theFrame = self.progressView.frame; 
    theFrame.size.width = self.frame.size.width * theProgress; 
    self.progressView.frame = theFrame; 
} 
@end 
2

Avevo un UIProgressView personalizzato con il proprio drawRect aggiornato da un processo in background. In iOS6 funzionava tutto mentre su iOS7 la barra di avanzamento non si aggiornava.

Ho aggiunto layoutSublayersOfLayer subito dopo la setProgress come questo

[self.loadingProgress setProgress:pv.floatValue]; 
[self.loadingProgress layoutSublayersOfLayer:self.loadingProgress.layer]; 

e ha funzionato come un fascino.

Spero che questo aiuti qualcuno.

1

Evitare un mal di testa e utilizzare questo eccellente libreria:

YLProgressBar

  1. Copia YLProgressBar.h e YLProgressBar.m dalla cartella YLProgressBar.
  2. #import "YLProgressBar.h" nel file (s) che si desidera utilizzare la barra di avanzamento
  3. Aggiungi la barra di avanzamento sia per codice o per xib
  4. progressBar.type = YLProgressBarTypeRounded; progressBar.progressTintColor = [UIColor greenColor]; progressBar.stripesOrientation = YLProgressBarStripesOrientationVertical; progressBar.stripesDirection = YLProgressBarStripesDirectionLeft;
  5. Hai una bella, barra di avanzamento completamente funzionale che supporta larghezza, altezza, modifiche.
+0

Grazie per il tuo suggerimento! La biblioteca sembra carina. In alcuni casi, tuttavia, non si desidera utilizzare librerie esterne, ad es. dal cliente. Soprattutto se non sono necessari per ottenere la funzionalità desiderata. –

+0

Non limitarti a pubblicare un link a una biblioteca. Mostra come può essere utilizzato (adattato alla domanda). Altrimenti questa è solo una risposta di solo collegamento. –

Problemi correlati