2012-11-15 107 views
6

我有一個UITextView,並且我試圖在用戶點擊一個按鈕時動畫框架的變化。基本上,文本視圖變得更大以適應屏幕,因此它可以顯示更多文本,然後當用戶再次輕敲按鈕時,它縮小到其原始框架。UITextView框架動畫更改不動畫文本重新分配

我使用的塊執行動畫,像這樣:

if(!isDisplayingDetailView) 
{ 
    //Expand view 
    [UIView animateWithDuration:0.5 
        animations:^{ 
         self.detailView.frame = self.view.frame; 
        } 
        completion:^(BOOL finished){ 
         isDisplayingDetailView = YES; 
        }]; 
} 
else{ 
    //Shrink view. 
    [UIView animateWithDuration:0.5 
        animations:^{ 
         self.detailView.frame = self.detailFrame; 
         } 
        completion:^(BOOL finished){ 
         isDisplayingDetailView = NO; 
        }]; 
} 

凡self.detailView是UITextView的,並且self.detailFrame只是一個的CGRect保持原始幀。 isDisplayingDetailView只是一個BOOL來檢查視圖是否擴展。 我的問題是,文字大小不是動畫。我從一個測試應用程序的一些截圖來說明我的問題: 應用默認視圖: Default view

展開視圖:

Expanded view

TextView的只是一時輕點按鈕後:

Shrinking view

正如你所看到的文本自動縮小到最終的幀大小,沒有任何ki動畫的nd,而邊界仍然是動畫。我想這是正確的行爲,但我想知道是否有可能使文本與視圖一起動畫。

+0

嗨,你有沒有找到解決辦法,如果是的請與我分享,我也陷在同樣的問題 –

+0

@VinayakaKarjigi抱歉,但我沒有找到解決辦法。 –

+0

也有同樣的問題。我的解決方案是渲染textview的圖像,將其放置在textview的位置,隱藏textview,然後爲圖像添加動畫。 – peko

回答

2

textviews中的文本並不總是按預期行事。爲此,您必須設置一個NSTimer並在每個打勾上設置框架大小。

做這樣的事情:

textview.frame = CGRectMake (textview.frame.origin.x, textview.frame.origin.y, textview.frame.size.width-1, textview.frame.size.height-1); 

然後當它這樣做我會完全從上海華刪除的TextView並將其設置爲無,然後初始化一個新的。原因是當出於某種原因在文本框中添加了填充時,更改了textviews的框架。你不會注意到它,除非你改變框架可能至少100次。

[textview removeFromSuperview]; 
textview = nil; 
textview = [[UITextView alloc] initWithFrame:CGRectMake(x, y, width, height)]; 
textview.text = yourTextString; 
//You will also have to set whatever non default properties you want, such as text or background color 
[view addSubview:textview]; 
+0

雖然我認爲這不是一個好的解決方案,但這實際上起作用。我會將其標記爲已接受。在你的代碼中,我們還必須設置新的textview文本。 –

+1

我同意這不是一個好的解決方案,但我不確定是否有其他選擇。不幸的是,你的問題涉及兩個uikit元素,它們不能按預期工作。 UIView動畫和textview調整大小。所以你必須使用NSTimer製作自己的動畫,而不是調整textview的大小,你必須完全重新制作所需的大小。 – Sean

1

另一個解決方案是動畫邊界的變化。

有幾種方法,但這裏有一個UITextView的簡單子類,它正是這樣做的。

import Foundation 
import UIKit 

import QuartzCore 

class SmoothTextView : UITextView { 

    override func actionForLayer(layer: CALayer!, forKey key: String!) -> CAAction! { 

     if key == "bounds" { 

      let x = super.actionForLayer(layer, forKey: "backgroundColor") 

      if let action:CAAnimation = x as? CAAnimation { 

       let transition = CATransition() 

       transition.type    = kCATransitionFade 
       transition.beginTime  = action.beginTime 
       transition.duration   = action.duration 
       transition.speed   = action.speed 
       transition.timeOffset  = action.timeOffset 
       transition.repeatCount  = action.repeatCount 
       transition.repeatDuration = action.repeatDuration 
       transition.autoreverses  = action.autoreverses 
       transition.fillMode   = action.fillMode 

       transition.timingFunction = action.timingFunction 
       transition.delegate = action.delegate 

       return transition 
      } 
     } 

     return super.actionForLayer(layer, forKey: key) 
    } 
} 

本作的iOS 8

作爲一個額外的調整,你可能想通過歸零所有填充或調整插圖文字容器來配置你的文本視圖實例的文本:

textView.textContainer.lineFragmentPadding = 0.0 
textView.textContainerInset = UIEdgeInsetsZero