- Je construire une application de Démonstration, utilisez hidesBottomBarWhenPushed cacher Tabbar dans la Poussée de l'Animation.
Mais, Lorsque je clique sur le Bouton de Saut Tabbar déplacer vers le haut!? comme ceci:
- Je construire une application de Démonstration, utilisez hidesBottomBarWhenPushed cacher Tabbar dans la Poussée de l'Animation.
Mais, Lorsque je clique sur le Bouton de Saut Tabbar déplacer vers le haut!? comme ceci:
Réponse fournie par VoidLess correctifs TabBar problèmes que partiellement. Il corrige les problèmes de mise en page à l'intérieur de tabbar, mais si vous utilisez viewcontroller qui cache tabbar, la tabbar est rendu de manière incorrecte lors des animations (à reproduire, il est préférable 2 ont 2 enchaîne un modal et une pression. Si vous alternez les enchaîne, vous pouvez voir tabbar rendu de celui-ci). Voir le code soufflet qui résout les deux problèmes. Bon travail d'apple.
class SafeAreaFixTabBar: UITabBar {
var oldSafeAreaInsets = UIEdgeInsets.zero
@available(iOS 11.0, *)
override func safeAreaInsetsDidChange() {
super.safeAreaInsetsDidChange()
if oldSafeAreaInsets != safeAreaInsets {
oldSafeAreaInsets = safeAreaInsets
invalidateIntrinsicContentSize()
superview?.setNeedsLayout()
superview?.layoutSubviews()
}
}
override func sizeThatFits(_ size: CGSize) -> CGSize {
var size = super.sizeThatFits(size)
if #available(iOS 11.0, *) {
let bottomInset = safeAreaInsets.bottom
if bottomInset > 0 && size.height < 50 && (size.height + bottomInset < 90) {
size.height += bottomInset
}
}
return size
}
override var frame: CGRect {
get {
return super.frame
}
set {
var tmp = newValue
if let superview = superview, tmp.maxY !=
superview.frame.height {
tmp.origin.y = superview.frame.height - tmp.height
}
super.frame = tmp
}
}
}
}
Code Objective-C:
@implementation VSTabBarFix {
UIEdgeInsets oldSafeAreaInsets;
}
- (void)awakeFromNib {
[super awakeFromNib];
oldSafeAreaInsets = UIEdgeInsetsZero;
}
- (void)safeAreaInsetsDidChange {
[super safeAreaInsetsDidChange];
if (!UIEdgeInsetsEqualToEdgeInsets(oldSafeAreaInsets, self.safeAreaInsets)) {
[self invalidateIntrinsicContentSize];
if (self.superview) {
[self.superview setNeedsLayout];
[self.superview layoutSubviews];
}
}
}
- (CGSize)sizeThatFits:(CGSize)size {
size = [super sizeThatFits:size];
if (@available(iOS 11.0, *)) {
float bottomInset = self.safeAreaInsets.bottom;
if (bottomInset > 0 && size.height < 50 && (size.height + bottomInset < 90)) {
size.height += bottomInset;
}
}
return size;
}
- (void)setFrame:(CGRect)frame {
if (self.superview) {
if (frame.origin.y + frame.size.height != self.superview.frame.size.height) {
frame.origin.y = self.superview.frame.size.height - frame.size.height;
}
}
[super setFrame:frame];
}
@end
C'est ma façon。 Déclarer une sous-classe de UITabBar, comme ActionTabBar
swift 3,4
class ActionTabBar: UITabBar {
override var frame: CGRect {
get {
return super.frame
}
set {
var tmp = newValue
if let superview = self.superview, tmp.maxY != superview.frame.height {
tmp.origin.y = superview.frame.height - tmp.height
}
super.frame = tmp
}
}
}
Objective-C
@implementation ActionTabbar
- (void)setFrame:(CGRect)frame
{
if (self.superview && CGRectGetMaxY(self.superview.bounds) != CGRectGetMaxY(frame)) {
frame.origin.y = CGRectGetHeight(self.superview.bounds) - CGRectGetHeight(frame);
}
[super setFrame:frame];
}
@end
Déclarer une sous-classe de NavigationController
@implementation XXNavigationController
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
[super pushViewController:viewController animated:animated];
CGRect frame = self.tabBarController.tabBar.frame;
frame.origin.y = [UIScreen mainScreen].bounds.size.height - frame.size.height;
self.tabBarController.tabBar.frame = frame;
}
Edit: Après la sortie de 12.1.1, ce problème a été résolu. Vous pouvez conserver la structure d'origine.
Si vous changez la structure de
UITabBarController -> UINavigationController -> UIViewController
pour
UINavigationController -> UITabBarController -> UIViewController
vous trouverez ce problème a été résolu. Je ne sais vraiment pas pourquoi Apple ne corrige pas ce problème.
Dans iOS 12.1, ce problème devient de plus en plus graves. Vous pouvez voir la TabBar texte sauter au-dessus de la TabBar à chaque fois, si vous utilisez le geste à la pop de retour.
Remarque: de Cette façon, peut certainement résoudre ce problème, mais je ne suis pas sûr de savoir si c'est une bonne idée. Aussi, si votre structure est assez compliqué, vous avez besoin de changer beaucoup de choses.
je vais vous donner une autre solution pour ce bug(semble qu'apple fait).
et la solution n'est pas d'interdire la tabbar déplacer vers le haut , mais pour faire de la zone noire n'apparaîtra pas lorsque tabbar déplacer vers le haut
le noyau chose, c'est d'ajouter une sous-vue pour votre viewcontroller comme le plus profond sous-vue et cette sous-vue de l'image est la taille de la fenêtre.ainsi, lorsque la tabbar déplace vers le haut , ce sous-vue sera montré insteadof zone noire
if (@available(iOS 11.0, *)) {
UIView* bgView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
bgView.autoresizingMask = UIViewAutoresizingNone;
bgView.backgroundColor = UIColorFromRGB(0xefeff4);
[self.view addSubview:bgView];
}
le confort de cette méthode est que vous n'aurez pas à sous-classe tabbar ou remplacer navigationcontroller de la méthode push
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.