Центрировать изображение в контроллере просмотра во время анимации

Я создаю экран-заставку для своего приложения в Swift, и у меня возникла проблема, когда при масштабировании изображения оно изменяется от верхнего левого угла и, следовательно, смещает все изображение от центра экран.

Я попытался вручную вычесть предполагаемую разницу в движении (как показано в приведенном ниже коде), но первая строка кода в закрытии не сохраняет изображение в центре для каждого размера экрана. На данный момент он отображается только в центре экрана iPhone 6 Plus.

UIView.animateWithDuration(1.5, animations: { () -> Void in
      self.image.frame = CGRectMake((self.image.center.x)/2 - 20, (self.image.center.y)/2 + 20, 250, 250)         
})

Есть ли строка кода, которая позволяет изображению оставаться по центру на всех размерах экрана даже после масштабирования?

Заранее спасибо всем, кто ответит.


person iProgramIt    schedule 10.07.2015    source источник


Ответы (4)


Вы можете использовать

self.image.center = self.view.center

или вы можете установить свойство UIImageView ContentMode как center в вашем InterfaceBuilder. Также убедитесь, что ваш splashImage.png соответствует размеру imageView, а размер SuperView. введите описание изображения здесь

person Sudhin Davis    schedule 10.07.2015

Вместо изменения frame измените bounds. Это позволяет вам изменять размер, оставляя неизменным center. Сохраните начало границ на 0,0 и измените только ширину и высоту границ на все, что захотите.

person matt    schedule 10.07.2015

Во-первых, самый простой способ сохранить центрирование некоторого UIImageView - это либо привязать его с помощью автоматического раскладки ко всем сторонам супервизора и установить для contentMode значение «Центр», как советует Судхин Дэвис, либо установить «Выровнять горизонтальный центр в контейнере» и «Выровнять по вертикали». Центрировать в контейнере "до 0 (оставляя высоту и ширину не заданными или удаленными во время сборки).

Но если вы хотите создать ViewController экрана-заставки, который будет «продлевать» представление изображения вашего «собственного экрана-заставки», пока вы выполняете некоторую работу, то вы можете использовать что-то вроде:

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view, typically from a nib.
    imageView?.image = UIImage(named: splashScreenImageName())
}

Где imageView - это простой выход UIImageView, привязанный ко всем сторонам его супервизора, а splashScreenImageName() - это функция, которая предоставляет имя изображения экрана-заставки с использованием одного из рекомендуемых подходов из ответов на этот вопрос.

Обычно я использую что-то вроде этого:

func splashScreenImageName() -> String {
    // Construct the name.
    var splashScreenImageName = "LaunchImage";
    if (UIDevice.isIPhone6Plus) {
        splashScreenImageName += "-800-Portrait-736h";
    }
    else if (UIDevice.isIPhone6) {
        splashScreenImageName += "-800-667h";
    }
    else if(UIDevice.isIPhone5) {
        splashScreenImageName += "-700-568h";
    }
    else if (UIDevice.isIPad) {
        splashScreenImageName += "-700-Landscape";
    }
    else {
        splashScreenImageName += "-700";
    }

    return splashScreenImageName;
}

Плюсы:

  • use повторно используют изображение экрана-заставки. Это означает, что вам не нужно добавлять еще 3 файла .jpgs для iPhone и 2 для iPad (для каждой ориентации) в пакет и синхронизировать их с «собственным экраном-заставкой».
  • поэтому вы уменьшаете размер связанного приложения.
  • полученное таким образом изображение будет на 100% совпадать с тем, которое было отображено во время презентации «родной заставки». Так что не должно появиться «прыжков».
person Nevs12    schedule 10.07.2015

Если вы хотите анимировать масштаб, почему бы вам не использовать CGAffineTransform?

image.transform = CGAffineTransformMakeScale(0.01, 0.01)
UIView.animateWithDuration(1.0, delay: 0, options: UIViewAnimationOptions.CurveEaseInOut, animations: { () -> Void in
        self.image.transform = CGAffineTransformIdentity
    }) { (finished) -> Void in

    }
person HMHero    schedule 10.07.2015