-1
votes

Comment: contraindre la sous-sousview à SafeArea Obj-C

Comment puis-je mettre à jour ce code de contrainte pour iPhone X et up? Ce code ne prend pas en charge les nouvelles tailles de vues et je me sens comme s'il pouvait être modifié un peu pour correspondre aux nouvelles spécifications. Si une mise à jour soit faite dans la fonction contenant addConstraintres code>?

@implementation UIView (JSQMessages)


- (void)jsq_pinSubview:(UIView *)subview toEdge:(NSLayoutAttribute)attribute
{


    [self addConstraint:[NSLayoutConstraint constraintWithItem:self
                                                     attribute:attribute
                                                     relatedBy:NSLayoutRelationEqual
                                                        toItem:subview
                                                     attribute:attribute
                                                    multiplier:1.0f
                                                      constant:0.0f]];

}

- (void)jsq_pinAllEdgesOfSubview:(UIView *)subview
{


    [self jsq_pinSubview:subview toEdge:NSLayoutAttributeBottom];
    [self jsq_pinSubview:subview toEdge:NSLayoutAttributeTop];
    [self jsq_pinSubview:subview toEdge:NSLayoutAttributeLeading];
    [self jsq_pinSubview:subview toEdge:NSLayoutAttributeTrailing];
}

@end


2 commentaires

Pouvez-vous expliquer quel est le problème? La phrase "Les nouvelles tailles de vues" ou "nouvelles spécifications" n'a pas de sens. Le code fait exactement ce qu'il dit que cela va faire: il épine une sous-vision exactement au SuperView ( auto ). Cela fonctionne exactement comme ça a toujours; Il n'y a rien à "mettre à jour". Si vous voulez faire quelque chose d'autre - et je parie que vous faites, bien que vous n'ayez pas expliqué - alors faites autre chose.


J'ajouterais également que personne n'utilise plus l'initialiseur NslayoutConstraint. Utilisez la notation anchor . Si vous souhaitez encore plus de raccourcissement, vous pouvez utiliser une bibliothèque comme Snapkit (bien que personnellement, je ne suis pas en faveur d'interposant une dépendance supplémentaire pour quelque chose d'aussi crucial).


3 Réponses :


1
votes

Ceci est le code que j'utilise pour quelque chose de similaire. Ajustez au goût.

+ ( void ) embed:( UIView * ) child
        into:( UIView * ) parent
{
    [parent addSubview:child];

    [child.topAnchor    constraintEqualToAnchor:parent.topAnchor].active    = YES;
    [child.rightAnchor  constraintEqualToAnchor:parent.rightAnchor].active  = YES;
    [child.leftAnchor   constraintEqualToAnchor:parent.leftAnchor].active   = YES;
    [child.bottomAnchor constraintEqualToAnchor:parent.bottomAnchor].active = YES;
}


1 commentaires

C'est bien parce qu'il utilise la notation d'ancrage, comme je l'ai suggéré. Mais notez qu'il n'a toujours rien à voir avec la zone de sécurité, comme indiqué par le titre de la question. Nous avons vraiment besoin de plus de clarification de la pop avant qu'une réponse soit possible.



1
votes

Conseil 1: Commencez à utiliser la syntaxe moderne ...

Astuce 2: N'utilisez pas «Aides de contrainte», à moins que cela n'améliore vraiment votre code et votre flux de travail.

Conseil 3: Voici un moyen Pour se conformer à la zone de sécurité: xxx


0 commentaires

0
votes

Merci à tous pour les réponses, j'ai fini par créer une extension pour le délégué et manipulé des contraintes de cette façon. Cela sera utile à l'avenir pour quiconque utilisant le forfait JSQMessages obsolète! Merci encore pour l'aide.

extension JSQMessagesInputToolbar {
override open func didMoveToWindow() {
    super.didMoveToWindow()
    if #available(iOS 11.0, *), let window = self.window {
        let anchor = window.safeAreaLayoutGuide.bottomAnchor
        bottomAnchor.constraint(lessThanOrEqualToSystemSpacingBelow: anchor, multiplier: 0.3).isActive = true
        }
    }
}


0 commentaires