6
votes

Pourquoi NaviggerItem.TitleView Alignera-t-il à gauche lorsque PresentModalViewController a appelé?

J'utilise un Uilabel pour le titreView d'une barre de navigation (je fais un navigateur Web in-app). Cela fonctionne bien, sauf que lorsque je présente un contrôleur d'affichage modal, le titreview se déplace du centre de la barre Navère à l'extrême gauche (sous le bouton arrière). J'ai testé en 3.0 et plus. Voici le code pertinent:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Title view label
    CGRect labelFrame = CGRectMake(0.0, 0.0, 120.0, 36.0); 
    UILabel *label = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];
    label.font = [UIFont boldSystemFontOfSize:14];
    label.numberOfLines = 2;
    label.backgroundColor = [UIColor clearColor];
    label.textAlignment = UITextAlignmentCenter;
    label.textColor = [UIColor whiteColor];
    label.shadowColor = [UIColor blackColor];
    label.shadowOffset = CGSizeMake(0.0, -1.0);
    label.lineBreakMode = UILineBreakModeMiddleTruncation;
    self.navigationItem.titleView = label;
}

-(void)displayComposerSheet:(NSString*)mailto 
{
    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
    picker.mailComposeDelegate = self;
    [self presentModalViewController:picker animated:YES];
    [picker release];
}


0 commentaires

7 Réponses :


1
votes

Est-ce qu'il anime? Il peut s'agir d'animation de la vue du titre comme s'il est en train de passer à une nouvelle vue. Je ne vois rien de mal avec votre code comme écrit.

Je suggérerais dans votre DisplayComPosersHeet, vous venez de définir le titreview, ou d'animer l'alpha du titreview à 0.0. Ensuite, animez-le à 1,0 lorsque vous renvoyez le contrôleur de vue modal. Pas idéal, mais cela peut sembler mieux de cette façon.

Franchement, tout le système d'uoinavigation est la merde. Nous sommes allés de l'avance et nous avons réécrivé cela à cause de problèmes bizarres comme ceux-ci.


3 commentaires

Oui, la vue modale est animée (la deuxième capture d'écran indique la présentation de la vue modale en cours). Le problème est que le titreview reste aligné à gauche, même après la mise en route de la vue modale.


Merci pour la suggestion. J'ai essayé quelques variations et j'ai trouvé un piratage qui "résout" le problème. Le code est dans ma réponse. Je t'avais upvote mais je n'ai pas assez de réputation.


Heureux d'avoir pu aider. Ouais, l'Uinav Stuff est un grave enustogle. C'est dommage que nous devions recourir à des corrections hacky comme ça.



1
votes

Le seul problème est votre taille de cadre. Donc, vous devez le changer.

Essayez celui-ci. xxx


1 commentaires

Hmm. J'ai donc essayé de changer la largeur à 320, mais la même chose se passe. Il semble ne pas tenir compte du cadre de l'Uilabel - à la place, il a laissé aligner le texte dans l'étiquette au bord gauche de l'écran: - /



3
votes

Merci à Dougw pour me pointer dans la bonne direction. Voici le meilleur hack que j'ai trouvé. Fondamentalement, je conserve l'Uilabel comme une propriété de classe. Avant de présenter une vue modale, je déséfinie le titreview, puis la réinitialisez immédiatement après. Lorsque la vue modale est rejetée, je ne fais pas que réinitialiser le titreview. À l'utilisateur, rien de tout cela n'est visiblement notable.

-(void)displayComposerSheet:(NSString*)mailto 
{
    self.navigationItem.titleView = nil;
    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
    picker.mailComposeDelegate = self;
    picker.navigationBar.tintColor = [APPDELEGATE getNavTintColor];
    [picker setToRecipients:[NSArray arrayWithObject:mailto]];
    [self presentModalViewController:picker animated:YES];
    [picker release];
    self.navigationItem.titleView = titlelabel;
}

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error 
{   
    self.navigationItem.titleView = nil;
    self.navigationItem.titleView = titlelabel;
    [self dismissModalViewControllerAnimated:YES];
}


1 commentaires

Dans - (void) LOADVIEW J'ai ajouté Self.Label = [[[[Uilabel Alloc] InitwithFrame: autoavigationController.navigationbar.frame]; Self.navigaterItem.TitleView = Self.Label; et puis seulement changé de texte de Self.Label



10
votes

J'ai examiné le problème avec un coup de contact et essayer de trouver les faits suivants:

  • Si la barre d'UINAVIGATION n'a pas le droit de droite, le titreview se déplace vers la droite par ~ 30PTS. LI>
  • Cela pourrait être reproduit pour le rougebarbuttonitem. Mais je n'ai pas essayé. Li> ul>

    dans un scénario où la barre d'Uinavigationbar d'une valeur par défaut (sans modification des défauts de valeur de droite) titreview est définie. Et puis une nouvelle uIView est poussée à la pile de navigation qui a un droit de droite. Maintenant, si cette vue est apparue [avec bouton arrière], la barre de navigation supprimera le droit de droite. Et cela représentera le décalage étrange qui change le titreview vers un côté. P>

    Comment j'ai corrigé le problème était comme celui-ci: P>

    self.navigationItem.titleView = myCustomTitleView;
    
    // Fake right button to align titleView properly.
    UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:[[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 1)]];
    // Width equivalent to system default Done button's (which appears on pushed view in my case).
    rightBarButtonItem.enabled = NO;
    self.navigationItem.rightBarButtonItem = rightBarButtonItem;
    


0 commentaires

-1
votes
  UIView *view=    [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
  [view setUserInteractionEnabled:NO];
  view.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"logo_small.png"]];
  UIBarButtonItem *barButton=[[UIBarButtonItem alloc]initWithCustomView:view ];
  self.navigationItem.leftBarButtonItem = barButton;

0 commentaires

0
votes

Vous pouvez essayer de déplacer le code dans viewDidAppear : xxx

Ça fonctionne pour moi.


0 commentaires

0
votes

Si vous modifiez la taille de la largeur pour être petite comme 100 points ou plus petite au lieu de 120, vous avez défini, ce problème peut disparaître. La largeur de l'étiquette plus petite a fonctionné pour moi.


0 commentaires