2016-03-06 43 views
1

我想要創建一個垂直UISlider,並將其準確地放入現有容器視圖中,該視圖的大小和位置使用autoLayout.xib文件。但是我根本無法實現它的功能,而且我的手指已經Google了。將垂直UISlider放入現有容器視圖中?

我得到的距離最近會創建一個太長的滑塊並延伸到屏幕外。

我把代碼放在錯誤的地方?

我把我的代碼在"layOutSubviews" 感興趣的幾個問題:

1.Per蘋果的文檔,視圖的「幀」是不是改造後有效,不應該設置。

2.滑塊的框架設置爲未來父代的尺寸之前的轉換(x和y交換)。

3.轉換後的視圖看起來在轉換前座標系中保持其邊界。即在90度變換之後,變換的視圖邊界的寬度和高度似乎被交換。

此代碼不起作用。除了延伸到屏幕底部之外,滑塊看起來是正確的。滑塊邊界甚至框架(蘋果認爲無效)似乎與容器視圖的界限和框架相匹配。滑塊甚至不會保持在它自己的範圍內。

[super layoutSubviews]; 

CGRect trigLevelSliderFrame=self.trigLevelSliderContainer.bounds; 
trigLevelSliderFrame.size.height=self.trigLevelSliderContainer.bounds.size.width; 
trigLevelSliderFrame.size.width=self.trigLevelSliderContainer.bounds.size.height; 

UISlider *mySlider=[[UISlider alloc] initWithFrame:trigLevelSliderFrame]; 
self.trigSlider=mySlider; 
[mySlider release]; 

self.trigSlider.transform=CGAffineTransformMakeRotation(-M_PI_2); 
CGPoint center=CGPointMake(self.trigLevelSliderContainer.bounds.size.width/2,self.trigLevelSliderContainer.bounds.size.height/2); 
self.trigSlider.center=center; 
[self.trigLevelSliderContainer addSubview:self.trigSlider]; 

回答

1

此代碼添加和旋轉滑塊沒有問題。問題是必須將代碼放入滑塊父視圖的「layoutSubviews」方法中;而是我在滑塊的父視圖的父視圖的「layoutSubviews」中擁有它。當我的原始代碼執行滑塊的父視圖還沒有佈局,並沒有正確的尺寸。

在視圖的「layoutSubviews」期間,子視圖尚未佈置,因此它們的邊界尚未生效。我需要等到佈局過程稍後才能獲得父視圖的邊界並將滑塊轉換爲適合的大小。

最後,我把代碼添加到頂級視圖控制器的「viewDidAppear」中的滑塊。這與原始問題中的代碼相同 - 只是在不同的地方。

+0

我不明白這個問題的解決方案,但你的回答給了我希望找到我自己的解決方案。如果你可以添加一些相關的代碼給你的答案,那就太酷了!對我來說,這絕對是一個「時間」問題......我只是將有問題的代碼切換到一個「viewDidAppear」函數,後者隨後加載並正確顯示不同的屏幕尺寸。 – PlateReverb

+0

我很高興我幫助過某人。我對此的記憶是模糊的;但是,正如我記得,我把滑塊放入一個包含視圖的大小和形狀的最終滑塊。我這樣做,所以我可以使用自動佈局。然後我編程地將滑塊放到容器視圖中,然後將其轉換爲與容器視圖的尺寸相匹配。我的錯誤是將容器視圖添加到容器視圖並將其旋轉到錯誤的位置 - 在容器視圖佈置之前。我會盡量編輯我的答案,以便更清楚。 – PaulB

+0

你如何知道佈局的容器視圖和你的代碼之間的順序來旋轉滑塊?自動佈局/ IB的東西和'viewDidLoad'函數的順序對我來說仍然是個謎(在我的問題出現之前,我假設IB /自動佈局總是會先發生。這裏是我的具體問題(和「哈克」解決方案),如果你有興趣的鏈接:http://stackoverflow.com/questions/41734256/uislider-handle-changes-width-on-different-size-ipads – PlateReverb