3

Вопрос по uiview, ios – Могу ли я повернуть UIView без черных полос?

У меня есть UIView, который занимает все окно на iphone. Когда он поворачивается в ландшафт, края получают маленькие черные полосы, пока он не встанет на место, как я и ожидал.

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

Кто-нибудь сделал это успешно?

  • Error: User Rate Limit Exceeded

    от
  • 0

    UINavigationController и UITabBarController имеют системные подпредста

    вления (UINavigationController: UINavigationTransitionView; UITabBarController: UITransitionView и UIViewControllerWrapperView), для которых layer.masksToBounds по умолчанию имеют значение YES. Чтобы устранить черные края во время вращения, вы должны установить для этих и всех других иерархических представлений layer.masksToBounds значение NO.

    Однако я не уверен, каков эффект изменения вышеупомянутых системных представлений ». Слои есть, поэтому я рекомендую сбросить их layer.masksToBounds обратно в YES, как только вы закончите анимацию.

  • 3

    Вам нужно сделать две вещи, чтобы это произошло.

    Во-первых, контроллер корневого представления окна всегда изменяет размер своего представления до размера окна. Таким образом, ваше общее представление должно быть подчиненным представлению контроллера корневого представления (чтобы не допустить его уменьшения), и представление вашего корневого контроллера должно иметьclipsToBounds установить на NO. На самом деле все предки большого взгляда должны иметьclipsToBounds установить на NO.

    Во-вторых, когда окно вращается, оно дает себе черные подпредставления для явного скрытия любых представлений, которые в противном случае появлялись бы за пределами окна. Он размещает эти черные подпредставления перед представлением своего корневого контроллера представления. Вам нужно переместить вид вашего корневого контроллера вида вперед, например:

    - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
        UIWindow *window = self.view.window;
        [window bringSubviewToFront:window.rootViewController.view];
    }
    

  • 2

    Я нашел альтернативный способ

    который работает, когда у вас два UIWindows перекрываются. (Это может иметь место, если вы хотите, чтобы в фоновом режиме не вращалось содержимое с вращающимся интерфейсом, плавающим сверху.) Идея состоит в том, чтобы непосредственно искать подпредставления черной полосы в самом переднем UIWindow при вызове willAnimateRotationToInterfaceOrientation и явно скрывать их , Следующий код ищет два уровня вглубь:

    -(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
        UIWindow* window = self.view.window;
        for (UIView* view in [window subviews]) {
            if (!CGRectIntersectsRect(window.bounds, view.frame)) {
                view.hidden = YES;
            }
    
            for (UIView* view_ in [view subviews]) {
                CGRect frame = [view_ convertRect:view_.frame toView:window];
                if (!CGRectIntersectsRect(window.bounds, frame)) {
                    view_.hidden = YES;
                }
            }
        }
    }
    

  • 0

    В настоящее время я работаю над приложением

    которое требует, чтобы экран вращался с меньшей скоростью, чем стандартная скорость. Чтобы остановить черный прямоугольник вращения, ограничивающий вид (со стандартной скоростью вращения) до того, как началось мое собственное вращение, я просто установил флажок рядом сGeneral -> Deployment Info -> Requires Full Screen.

    enter image description here

    У меня также есть строка состояния, скрытая на контроллере представления, хотя окно скрытия строки состояния не отмечено.