2017-01-07 5 views
0

텍스트 뷰가 속한보기의 크기를 조정하고보기가 커지거나 작아지면 텍스트가 흔들립니다.보기 크기 조정시 텍스트 뷰 흔들림

선언의 텍스트보기 말했다

lazy var textview: UITextView = { 
     let textView = UITextView() 
     textView.text = "" 
     textView.font = .systemFont(ofSize: 12, weight: UIFontWeightMedium) 
     textView.isScrollEnabled = false 
     textView.isEditable = false 
     textView.isSelectable = true 
     textView.isUserInteractionEnabled = true 
     textView.translatesAutoresizingMaskIntoConstraints = false 
     textView.textAlignment = .center 
     textView.textColor = .lightGray 
     textView.dataDetectorTypes = .link 
     return textView 
    }() 

내가 그것을 그렇게되면이

if let window = UIApplication.shared.keyWindow { 
    let statusBarHeight = UIApplication.shared.statusBarFrame.size.height 

    UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveLinear, animations: { 

     self.frame = CGRect(x: 0, y: statusBarHeight, width: window.frame.width, height: window.frame.height - statusBarHeight) 

     self.layer.cornerRadius = 0 

     self.layoutIfNeeded() 

    }, completion: nil) 
} 

처럼 전체 화면에 맞게에 있다고보기의 크기를 조정하고있어,보기는 완벽하게 확장하지만, textviews 텍스트는 애니메이션을 매우 전문적이지 않게 만드는 바운스 효과를냅니다 ... 조언이 있습니까?

편집 : 센터 텍스트 정렬 옵션을 제거해도 문제가없는 것 같습니다. 텍스트 센터를 정렬하여 작동하게하려면 어떻게해야합니까?

+1

이 문제의 원인이 아니라 코드가 이해되지 않는다 점에 유의하시기 바랍니다. 왜 layoutIfNeeded 호출 프레임을 변경하고 있습니까? – matt

+0

@matt layoutIfNeeded를 제거하면 애니메이션이 부드러워집니다. 왜 그런지 모르겠습니다. 감사합니다 – Walker

+0

@ matt 내가 textviews 제약 조건을 제거해야 프레임을 움직이는 .. 그리고 그들을 readd? 모든 것은 괜찮아요. 이상한 튀는 효과를내는 textviews 텍스트 일뿐입니다. – Walker

답변

0

편집 : 나는 이것을 다시보고 UIScrollView animation of height and contentOffset "jumps" content from bottom에 기반한 기술을 사용하려고 시도했습니다.

나를 위해 작동하는 가운데 맞춤 텍스트 정렬을 사용하는 텍스트보기의 최소 작동 예제입니다.

모든 애니메이션을 제약 조건 기반으로 관리하거나 모든 프레임 기반으로 관리하는 것이 좋습니다. 애니메이션이 컨테이너 뷰 프레임을 업데이트하여 구동되는 버전을 시도했지만이 제약 기반 접근 방식에서 너무 오래 걸리기 시작했습니다.

희망이 올바른 방향으로 포인트 :

import UIKit 

class ViewController: UIViewController { 

    lazy var textView: UITextView = { 
     let textView = UITextView() 
     textView.text = "testing text view" 
     textView.textAlignment = .center 
     textView.translatesAutoresizingMaskIntoConstraints = false 
     return textView 
    }() 

    lazy var containerView: UIView = { 
     let view = UIView() 
     view.translatesAutoresizingMaskIntoConstraints = false 
     return view 
    }() 

    var widthConstraint: NSLayoutConstraint! 
    var topAnchor: NSLayoutConstraint! 

    override func viewDidLoad() { 

     view.backgroundColor = .groupTableViewBackground 

     // add container view and constraints 
     view.addSubview(containerView) 
     containerView.frame = view.bounds.insetBy(dx: 100, dy: 200) 
     containerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
     containerView.heightAnchor.constraint(equalToConstant: 100).isActive = true 

     // keep reference to topAnchor and width as properties to animate 
     topAnchor = containerView.topAnchor.constraint(lessThanOrEqualTo: view.topAnchor, constant: 100) 
     widthConstraint = containerView.widthAnchor.constraint(equalToConstant: 300) 
     topAnchor.isActive = true 
     widthConstraint.isActive = true 

     // add text view to container view and set constraints 
     containerView.addSubview(textView) 
     textView.leftAnchor.constraint(equalTo: containerView.leftAnchor).isActive = true 
     textView.rightAnchor.constraint(equalTo: containerView.rightAnchor).isActive = true 
     textView.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true 
     textView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor).isActive = true 
    } 

    @IBAction func toggleResize(_ sender: UIButton) { 

     sender.isSelected = !sender.isSelected 

     view.layoutIfNeeded() 
     widthConstraint.constant = sender.isSelected ? view.bounds.width : 300 
     topAnchor.constant = sender.isSelected ? 20 : 100 

     // caculate the textView content offset for starting position based on 
     // expected end position at end of the animation 
     let xOffset = (textView.bounds.width - widthConstraint.constant)/2 
     textView.contentOffset = CGPoint(x: -xOffset, y: textView.contentOffset.y) 

     UIView.animate(withDuration: 1) { 
      self.view.layoutIfNeeded() 
     } 
    } 
} 
+0

'self.layoutIfNeeded()'를 떠나면서 애니메이션을 변경해도 아무 것도 바뀌지 않습니다. 그런 다음'self.layoutIfNeeded()'를 제거해도 텍스트 뷰가 바운스되지는 않지만 전반적인 애니메이션이 어수선하게 보입니다. 다른 아이디어? Thanks @MathewS – Walker

+0

@Walker 좀 더 자세한 내용으로 답변을 업데이트했습니다. – MathewS

+0

내가 업데이트하고있는 프레임은 텍스트보기와 다른 많은보기가있는보기에 속합니다 ... 크기가 어떻게 변하지 않는지 보지 않습니다. 보기 및 텍스트보기 만이 해결할 것입니다. – Walker