2014-01-17 90 views
0

我的應用程序有一個名爲stepview的UIView,它需要增長和縮小,始終向下向右擴展,並始終向左縮小。它有一個子視圖durationLabel,它沿着stepView的整個寬度運行,並具有固定的高度。當主視圖縮小時,子視圖不能正常動畫

當stepView動畫變得更大時,標籤隨之一起正常增長:文本和標籤的背景與增長的stepView同步向右滑動。但是,當stepView動畫變小時,會立即捕捉到新的大小,在stepView縮小的右邊緣和右邊緣之間留下間隙,直到動畫完成。

標籤初始化代碼在stepView.m:

CGRect duration_frame = CGRectMake(0, 0, self.frame.size.width, HEADER_HEIGHT); 
self.durationLabel = [[UILabel alloc] initWithFrame:duration_frame]; 
[self.durationLabel setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; 
[self addSubview:self.durationLabel]; 

並且動畫代碼:

[UIView animateWithDuration:ANIM_DURATION 
    animations:^{ 
     [stepView setFrame:newFrame]; 
    } 
]; 

使用邊界/中心,而不是幀產生相同的效果。我考慮過使用轉換,但計算「newFrame」的代碼有些涉及,所以我寧願避免在可能的情況下重寫它。我也嘗試在相同的動畫塊中手動更改標籤的框架,但這只是簡單地使其完全消失(可能是因爲我試圖在同一個動畫塊中同時爲視圖的框架和子視圖的框架設置動畫?)。我也已經確認stepView和它的子視圖不會同時經歷任何其他動畫,儘管在不同的動畫塊中有不相關的視圖發生動畫。

對於爲何標籤應該在stepView增長時完美動畫,但在收縮時無法動畫的問題,我感到茫然。我在文檔中沒有看到任何可能會有區別的東西。感謝您提供任何幫助。

回答

1

我認爲這是UILabel的問題 - 使用另一個UIView作爲子視圖而不是UILabel,動畫在收縮時也能正常工作。

如果我理解正確的話,你需要獲得的結果是什麼,但是,我建議你嘗試以下方法:

  • 沒有設置autoresizingMask屬性

    // [self.durationLabel setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; 
    
  • 集stepView clipToBounds屬性爲YES

    self.clipToBounds = YES; 
    

這樣UILabel框架將不會改變,但只有實際在stepView界限內的部分將可見。我希望這可能會有所幫助。

更新:剛做了一個快速的研究,發現這個問題已經在這裏回答了resize uiview with UILabel and animate it correctly - 提供的答案似乎與我上面提出的建議一致。

+0

剛試過這個,以及你連接的解決方案(我沒有想到特別尋找UILabel,對此抱歉!)。目前還沒有工作:標籤只是保持原來的大小,而不是增長。據我瞭解,訣竅是手動更改容器視圖的框架以及stepView的框架,而不依賴autoResizing呢? (我不認爲我已經完全探索過這個解決方案,但是當然在承諾我花了幾個小時來測試之後,我被告知要發射一些火,但是我會盡快趕到!) – embodiment

+0

只需提一下,我也試着將標籤製作爲最大的stepView寬度,並確保stepView.clipstoBounds = YES。奇怪的是,標籤最初看起來是正確的,並且正常增長,但是當stepView縮小標籤的全寬變得可見時,即使stepView的clipsToBounds仍然爲YES,也會超出stepView的框架。這個週末我會試着去捅這個...... – embodiment

相關問題