2012-11-15 3 views
6

UITextView가 있고 사용자가 단추를 누를 때 프레임 변경을 애니메이션으로 적용하려고합니다. 기본적으로 텍스트보기는 화면에 맞게 커지므로 더 많은 텍스트를 표시 할 수 있습니다. 그런 다음 사용자가 단추를 다시 탭하면 원래 프레임으로 축소됩니다.UITextView 애니메이션 변경 프레임이 텍스트 재 할당 애니메이션을 적용하지 않습니다.

은이 같은 블록을 이용하여 애니메이션을 수행

self.detailView가 UITextView이고 self.detailFrame 단지 오리지널 프레임 채 CGRect이다
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; 
        }]; 
} 

. isDisplayingDetailView는, 뷰가 전개되고 있는지 어떤지를 조사하는 BOOL입니다. 제 문제는 텍스트 크기가 애니메이션이 아니란 것입니다. 앱의 기본보기 : 나는 내 문제를 설명하기 위해 테스트 응용 프로그램에서 일부 스크린 샷을 만든 Default view

확장보기 :

Expanded view

텍스트 뷰 잠시 버튼을 눌러 후 :

Shrinking view

텍스트가 자동으로 최종 프레임 크기로 축소되는 것을 볼 수 있습니다. 경계선은 여전히 ​​애니 메이팅되는 반면 애니메이션은 그게 올바른 행동 인 것 같아요.하지만 텍스트를 애니메이션과 함께 볼 수 있는지 알고 싶습니다.

+0

안녕하세요,이 해결책을 찾았습니까? 그렇다면 나와 공유하십시오. 나는 또한 같은 문제에 봉착했습니다. –

+0

@VinayakaKarjigi 미안하지만 해결책을 찾지 못했습니다. –

+0

도 같은 문제가있었습니다. 내 솔루션은 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); 

가 나는 완전히 수퍼에서 텍스트 뷰를 제거하고 전무로 설정 한 다음 새로운 init을 것입니다 이루어집니다 그런 때. 그 이유는 변경 될 때 어떤 이유로 텍스트 뷰의 프레임이 텍스트 상자 주위에 추가된다는 것입니다. 아마도 프레임을 적어도 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

나는 그것이 훌륭한 해결책은 아니라는 데 동의하지만 다른 옵션이 있는지 확실하지 않습니다. 불행히도 문제는 예상대로 작동하지 않는 두 가지 요소가 포함되어 있습니다. UIView 애니메이션 및 텍스트 뷰 크기 조정. 따라서 NSTimer를 활용하여 자신의 애니메이션을 만들어야하며 텍스트 뷰의 크기를 조정하는 대신 원하는 크기로 완전히 다시 만들어야합니다. – Sean

1

또 다른 해결책은 경계 변경을 애니메이션으로 만드는 것입니다.

몇 가지 방법이 있지만 여기 정확히 UITextView이라는 간단한 하위 클래스가 있습니다. 아이폰 OS의 같은

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) 
    } 
} 

이를 8

추가 팅겨, 당신은 모든 패딩 또는 세트 영점 조정하여 텍스트 컨테이너를 조정하여 텍스트보기 인스턴스의 텍스트를 구성 할 수 있습니다으로 :

textView.textContainer.lineFragmentPadding = 0.0 
textView.textContainerInset = UIEdgeInsetsZero 
관련 문제