UISearchBar анимируется на место, когда superview выкладывает подпредставления. Как отключить? - PullRequest
1 голос
/ 25 октября 2019

Моя проблема: У меня есть процесс регистрации пользователя, который использует UINavigationController для представления каждого шага в процессе адаптации. При нажатии на контроллеры вида с UISearchBar s внутри, UISearchBar s анимируются на месте.

Как выглядит моя проблема: https://youtu.be/TKPLeJ9FmI4 (проблема возникает около 0: 27 , 0: 32 , 0: 41 )

То, что я собрал: Это, кажется, происходит, когда предыдущий контроллер представления в стеке выполняет асинхронную функцию непосредственно перед тем, как он выталкивает следующий контроллер представленияи, по-видимому, не выполняет асинхронную функцию до тех пор, пока UISearchBar уже не будет анимирован на месте.

Что я пробовал: Я попытался создать подкласс UISearchBar и убедиться, что layoutSubviews не анимируется с помощью UIView.performWithoutAnimation:

import UIKit

class SearchBar: UISearchBar {
    override func layoutSubviews() {
        UIView.performWithoutAnimation {
            super.layoutSubviews()
        }
    }
}

Точно так же япытался убедиться, что супервид UISearchBar не анимируется при размещении подпредставлений:

class MyViewController: UIViewController {
    @IBOutlet var searchBar: UISearchBar!

    override func viewDidLayoutSubviews() {
        UIView.performWithoutAnimation {
            super.viewDidLayoutSubviews()
        }
    }
}

Что мне интересно: Поскольку трудно точно определить точную причинумне интересно, есть ли способ просто предотвратить анимацию UISearchBar в целом. Никогда не будет времени, когда мне нужно оживить UISearchBar.

1 Ответ

1 голос
/ 27 октября 2019

это работает для меня в Objective-C. Похоже, что вы достаточно компетентны, чтобы перевести это на Swift:

  [[UISearchBar appearance] setBackgroundImage:[UIImage new]
                                forBarPosition:UIBarPositionAny
                                    barMetrics:UIBarMetricsDefault];

  [[UISearchBar appearance] setBackgroundImage:[UIImage new]
                                forBarPosition:UIBarPositionAny
                                    barMetrics:UIBarMetricsDefaultPrompt];

[self.searchBar setSearchFieldBackgroundImage:finalImage forState:UIControlStateNormal];

Где "finalImage" - это изображение, которое вы рисуете в коде, который возвращает UIImage того же размера прямоугольника, что и UISearchBar. Вы можете найти способы нарисовать изображение нужного цвета фона, а затем закруглить углы изображения. Вот и в Objective-C.

- (UIImage *)imageWithColor:(UIColor *)color withSize:(CGRect)imageRect {
  UIGraphicsBeginImageContext(imageRect.size);
  CGContextRef context = UIGraphicsGetCurrentContext();

  CGContextSetFillColorWithColor(context, [color CGColor]);
  CGContextFillRect(context, imageRect);

  UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();

  return image;
}

- (UIImage *)roundImage:(UIImage *)image withRadius:(CGFloat)radius {
  CGRect rect = CGRectMake(0.0, 0.0, 0.0, 0.0);
  rect.size = image.size;
  UIGraphicsBeginImageContextWithOptions(image.size, NO, [UIScreen mainScreen].scale);
  UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect
                                                  cornerRadius:radius];
  [path addClip];
  [image drawInRect:rect];

  image = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();

  return image;
}

, поэтому полное объявление UISearchBar будет таким:

  self.searchBar = [UISearchBar new];
  CGRect rect = CGRectMake(0.0, 0.0, 44, 35);
  UIImage *colorImage = [self imageWithColor:[UIColor whiteColor] withSize:rect];
  UIImage *finalImage = [self roundImage:colorImage withRadius:10.0];
  [self.searchBar setSearchFieldBackgroundImage:finalImage forState:UIControlStateNormal];
  [self.searchBar setTranslatesAutoresizingMaskIntoConstraints:false];
  [self.view addSubview:self.searchBar];

Это единственный найденный мной способ удалитьвся прикольная анимация добавлена ​​Apple и настраивает фон по вашему желанию. Удачи (и для тех, кто понизит это, потому что это не в Swift, вы должны знать, что Swift - это Ruby 2.0 и язык мемов, пока настоящие программисты не сделают его языком мемов, поэтому придерживайтесь Objective-C).

Удачи

РЕДАКТИРОВАТЬ

убедитесь, что вы устанавливаете ограничения, если вы используете ограничения макета, если вы не используете ограничения, то удалите

  [self.searchBar setTranslatesAutoresizingMaskIntoConstraints:false];

и затем установите рамку UISearchBar

...