我創建了一個名爲CTCycleClock的名爲CTCycleSlider的子視圖的自定義UIView。它對一個手勢作出反應,以便它可以在一個軸上旋轉(就像從上面看輪盤表一樣)。在AutoLayout中重置固定寬度和高度
爲了實現這一點,在主視圖CTCycleClock創建對CTCycleSlider子視圖兩個約束其居中於X和Y
實施例:
此外,CTCycleSlider子視圖創建兩個約束本身設置了特定的寬度和高度。這是必要的,否則在旋轉時,磁盤會變大。
這工作很好,正確。但是當超視圖的尺寸更大時(比如在iPad上),我不知道如何告訴AutoLayout子視圖有一個新的固定寬度和高度等於超視圖。
這是我在上海華設置約束:
NSLayoutConstraint *centerX = [NSLayoutConstraint
constraintWithItem:subview
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeCenterX
multiplier:1.f constant:0.f];
NSLayoutConstraint *centerY = [NSLayoutConstraint
constraintWithItem:subview
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeCenterY
multiplier:1.f constant:0.f];
[self addConstraint:centerX];
[self addConstraint:centerY];
這是如何設置的約束的子視圖,其中self.widthAndHeight目前硬編碼到320上iPhone和450上ipad公司:
NSLayoutConstraint *w = [NSLayoutConstraint
constraintWithItem:self
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeWidth
multiplier:1.0f
constant:self.widthAndHeight];
NSLayoutConstraint *h = [NSLayoutConstraint
constraintWithItem:self
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeWidth
multiplier:1.0f
constant:self.widthAndHeight];
[self addConstraint:w];
[self addConstraint:h];
所以我的問題是:我怎樣才能讓一個子視圖擁有一定的餘量先擁抱超級視圖框架,但也設置其寬度和高度固定?
編輯:一些澄清,爲什麼我需要約束,設置寬度/高度固定。
當我將不設置寬度/高度固定,用戶觸摸旋轉輪盤,你會得到以下結果:
在上圖中,我給自己定將top/lead/width/height設置爲superview的子視圖的約束條件。當用戶還沒有旋轉車輪子視圖時,這很好用,但是當他們這樣做時,自動佈局約束迫使矩形UIView更小,因此它完全適合超級視圖。
因此,問題仍然存在:如何創建約束條件,最初將子視圖的大小正確調整到超級視圖,但隨後在旋轉時設置固定的寬度/高度,它保持相同的大小?
增加了一些說明。我把它集中在超級視圖中。我不想修復這個大小,它應該依賴於superview。但似乎我被迫,因爲否則它會調整輪換。順便說一句,它不是一個圖像,而是一個自定義繪製的視圖(即它覆蓋了drawRect)。 –
因此,將自定義視圖的高度和寬度設置爲與超級視圖相同的大小。 –
我該怎麼做?我不知道做這件事的正確地點。問題是我需要在layoutSubviews被調用之前設置這些固定寬度/高度約束,但是在那個階段,superview的寬度/高度還不知道(因爲layoutSubviews先在子視圖上調用,然後在superviews,據我所知)。 –