簡體   English   中英

Autolayout中的viewDidLayoutSubviews,在UIPageViewController上旋轉

[英]viewDidLayoutSubviews in Autolayout with rotation on UIPageViewController

我有一個UIPageViewController其視圖控制器包含一個UIScrollView ,其中包含一個UIImageView 在加載的視圖控制器viewWillAppear ,如果旋轉視圖,則邊界不正確。 這就是我試圖動態地基於根據所述圖像的尺寸的圖像視圖定位 我試圖使用(void)viewDidLayoutSubviews但我需要調用[self.view layoutSubviews]或者我得到一個斷言錯誤。 當我添加它,然后我不能再縮放圖像視圖。 您可以看到它嘗試縮放但調整大小到最小縮放。

我對自動布局完全不熟悉,並試圖看看我是否遺漏了一些東西。

我目前的修復涉及檢查框架的邊界以查看方向是否與邊界匹配。 如果是這樣,那么我按原樣使用邊界。 如果沒有,那么我在計算中切換高度和寬度。

我想知道如何正確使用viewDidLayoutSubviews而不會剝奪我放大圖像視圖的能力。

從兩個答案中,看起來viewDidLayoutSubviews可能是布局視圖的錯誤位置。 我試圖找到應該在哪里完成並讓視圖知道它們的邊界和方向,但在它們在屏幕上可見之前。 從我的閱讀,我認為這是viewDidLayoutSubviews但似乎使用可能會導致無限循環。

從兩個答案中,看起來viewDidLayoutSubviews可能是布局視圖的錯誤位置。 我試圖找到應該在哪里完成並讓視圖知道它們的邊界和方向,但在它們在屏幕上可見之前。

我將子類化UIScrollView並覆蓋layoutSubviews ,系統將僅在需要時以及所有變量(方向,大小等)具有適當的值時為您調用。

首先,你不應該自己調用-layoutSubviews 從該方法UIView 文檔

您不應該直接調用此方法。 如果要強制進行布局更新,請在下次繪圖更新之前調用setNeedsLayout方法。 如果要立即更新視圖的布局,請調用layoutIfNeeded方法。

即使沒有警告,從-viewDidLayoutSubviews調用該方法似乎也是問題的一個方法 - -viewDidLayoutSubviews來通知您的視圖控制器它的視圖只是將其設置為子視圖,因此調用[self.view layoutSubviews]可能很容易導致環。

在加載的視圖控制器viewWillAppear中,如果旋轉視圖,則邊界不正確。

請記住,當-viewWillAppear時,視圖尚未添加到視圖層次結構中 鑒於此,您的當前方法似乎並不壞。 視圖尚未設置其邊界(因為它尚未添加),因此您可以確定邊界的內容並使用它來設置視圖。 另一個可能更好的方法是使用-viewDidAppear ,因為你的視圖將在那時添加,並且應該具有正確的邊界。

當我添加它,然后我不能再縮放圖像視圖。 您可以看到它嘗試縮放但調整大小到最小縮放。

聽起來您在放置圖像視圖時沒有考慮縮放狀態。 確保-viewDidLayoutSubviews中的代碼不會否定滾動視圖正在執行的工作。

您根本不需要更改圖像視圖的位置 - 這正是自動布局擅長的那種。 我注意到您作為示例使用的ImageScrollViewController.m文件不會更改圖像視圖的位置。

我不完全確定您的視圖層次結構,但是如果您有一個包含UIScrollView的視圖控制器,則此答案將說明如何執行此操作。 (所述視圖控制器稍后在UIPageViewController中顯示,但這與此無關)。

在視圖控制器中覆蓋以下控制滾動視圖的方法:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];

    CGRect bounds = self.view.bounds;
    self.scrollView.frame = bounds;

    //
    // Calculate a rect for your image view according to bounds
    //
    self.imageView.frame = calculatedFrame;
}

問題是您的視圖將在滾動/縮放期間進行布局,如果您將視圖放置在控制scrollView的視圖控制器的viewDidLayoutSubviews中,則每次用戶滾動或縮放時都會對其進行定位。

我懷疑你的視圖控制器可能直接控制UIScrollView(而不是控制具有UIScrollView子視圖的視圖),在這種情況下,只需刪除self.scrollView.frame = self.bounds行。

你永遠不應該從viewDidLayoutSubviews調用[self.view layoutSubviews]。 事實上,你根本不應該打電話給那個功能。 如果您需要更新布局,請調用[self.view setNeedsLayout]。 但是當您的視圖執行了其layoutSubviews時,會自動調用viewDidLayoutSubviews。 這意味着如果從那里調用該函數,您將獲得無限循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM