34 votes

iOS11 UIToolBar Contentview

En iOS 11 boutons et champ de texte ne sont pas être sous-vues d' UIToolBar. La comparaison de vue de la hiérarchie à l' iOS 10 nous voir il y a un _UIToolBarContentView sur tous les sous-vue d' UIToolBar.

Par exemple, cette nouvelle mise en page de l' UIToolBar pauses slacktextviewcontroller https://github.com/slackhq/SlackTextViewController/issues/604

Besoin d'une solution de travail en iOS 10/11.

35voto

malex Points 2992

Pour résoudre le problème de la iOS11 (compatible avec les versions inférieures) vous avez seulement besoin de pour faire layoutSubview juste après UIToolBar a été ajouté comme une sous-vue de l'INTERFACE utilisateur de la hiérarchie.

Dans ce cas - _UIToolbarContentView abaisse à la première sous-vue de UIToolBar, et vous pouvez ajouter tous les sous-vues plus comme avant.

Par exemple, en ObjC,

    UIToolbar *toolbar = [UIToolbar new];
    [self addSubview: toolbar];
    [toolbar layoutIfNeeded];

    <here one can add all subviews needed>

Le même problème se produit avec slacktextviewcontroller

3voto

J'ai résolu ce problème dans mon cas. Je réécris la méthode layoutSubviews dans la sous-classe de UIToobar et change le userInteractionEnable de _UIToolbarContentView en NO.

 - (void)layoutSubviews {
    [super layoutSubviews];


    NSArray *subViewArray = [self subviews];

    for (id view in subViewArray) {
        if ([view isKindOfClass:(NSClassFromString(@"_UIToolbarContentView"))]) {
            UIView *testView = view;
            testView.userInteractionEnabled = NO;
         }
     }

}
 

1voto

hengyu Points 66

Vous pouvez simplement utiliser l' hitTest(_:with:) méthode.

  1. Tout d'abord, la création d'une propriété contentView en UIToolbar:

    open private(set) var contentView: UIView = UIView()
    
  2. Ensuite, faire l' contentView's image le même que l' UIToolbars'. Par exemple:

    contentView.frame = bounds
    contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    addSubview(contentView)
    
  3. Enfin, remplacer l' hitTest(_:with:) méthode:

    open override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        if self.point(inside: point, with: event) {
            if let hitTestView = contentView.hitTest(point, with: event) {
                return hitTestView
            } else {
                return self
            }
        } else {
            return nil
        }
    }
    

Dans cette situation, si vous souhaitez personnaliser une barre d'outils en ajoutant simplement des vues supplémentaires, vous devez les ajouter à l' contentView afin d'être positionné de manière appropriée.

0voto

voromax Points 2026

Le nouveau UIToolbar objet utilise activement mise en page basée sur les contraintes, il est donc préférable de substituer - (void)updateConstraints méthode. De présenter des vues personnalisées sur UIToolbar objet, il est préférable de sous-classe et ajouter un conteneur personnalisé de vue:

- (UIView *)containerView
{
    if (_containerView) {
        return _containerView;
    }
    _containerView = [[UIView alloc] initWithFrame:self.bounds];
    _containerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    return _containerView;
}

Maintenant vous pouvez ajouter votre vues personnalisées pour le conteneur de vue. Pour rendre les vues personnalisées réactif, nous avons besoin de changer l'ordre de la barre d'outils des sous-vues après les contraintes de mise à jour:

- (void)updateConstraints
{
    [super updateConstraints];

    [self bringSubviewToFront:self.containerView];
}

Notez que si vous utilisez UINavigationController avec la barre d'outils personnalisée, vous devez forcer la mise à jour de sa mise en page avant d'ajouter votre personnalisé des sous-vues.

-2voto

user3077369 Points 9

Il y a une façon bizarre de le faire.

 [self.textInputbar sendSubviewToBack:[self.textInputbar.subviews lastObject]];
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X