我正在使用:Swift,autolayout并在storyboard中创建所有视图。我以编程方式修改内容。 我有以下设计;黑盒子是图片,下面是图片的日期和主题,下面是标题,在底部我有一个从webource加载的textview。我已禁用textview上的滚动,因为我只想滚动滚动视图。 那么如何解决这个问题的最佳方法呢,那么我将能够滚动到textview的底部,向我显示所有文本?
我的想法是以某种方式在将内容加载到其中后检索textview的内容高度(ViewDidLoad)。然后将其添加到从textview的原始高度中扣除的scrollview的高度。但必须说,对于我认为是标准功能的东西来说似乎很难。 关于这个的任何想法?
到目前为止,我的代码看起来确实如此,但它似乎无法正常工作:
override func viewDidAppear(animated: Bool)
{
println("Height: \(self.textView.frame.height)") // prints 222.0
let contentSize = self.textView.sizeThatFits(self.textView.bounds.size)
var frame = textView.frame
frame.size.height = contentSize.height
textView.frame = frame
println("Height: \(self.textView.frame.height)") // prints 283.5
}
override func viewDidLoad()
{
super.viewDidLoad()
self.textView.layoutIfNeeded()
println("Height: \(self.textView.frame.height)") //prints 222.0
//self.textView.delegate = self
}
代码示例2:
let sizeThatFits = CGSizeMake(self.textView.frame.size.width, CGFloat(MAXFLOAT))
//CGSize sizeThatFits = [self.textView sizeThatFits:CGSizeMake(self.textView.frame.size.width, MAXFLOAT)]
self.textViewHeight = sizeThatFits.height
错误消息:NSNumber不是NSLayoutConstraint的子类型。
下面的语法似乎没问题。 代码示例3:
self.textView.addObserver(self, forkeypath: "contentSize", options: NSKeyValueObservingOptions, context: nil)
答案 0 :(得分:3)
滚动视图在自动布局方面有点复杂,这使得使用它们变得更加困难。
您可能在故事板中为textView设置了宽度和高度约束(否则您将对scrollView有不明确的contentSize警告)。
我找到了解决问题的方法,只是试了一下,效果很好。
首先,您需要在viewController中从UITextView高度约束创建一个插座:
@interface ViewController ()
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *textViewHeightConstraint;
@end
然后,在viewDidLoad中,您将自己添加为contentSize
textView
属性的观察者
- (void)viewDidLoad {
[super viewDidLoad];
// All you other stuff ...
[self.textView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionInitial context:nil];
}
然后在observeValueForKeyPath
中更新textView
的高度约束,如下所示:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
[self.textViewHeightConstraint setConstant:self.textView.contentSize.height];
}
然后不要忘记删除观察者,以免发生崩溃
- (void)dealloc {
[self.textView removeObserver:self forKeyPath:@"contentSize"];
}
要实现此功能,您必须确保从textView
到scrollView
具有顶部和底部偏移约束。
如果您需要更多帮助,请告诉我。
如果您使用swift
,这就是您的实现方式class YourViewController: UIViewController {
@IBOutlet weak var textView: UITextView!
@IBOutlet weak var textViewHeightConstraint: NSLayoutConstraint!
override
func viewDidLoad (){
textView.addObserver(self, forKeyPath: "contentSize", options:NSKeyValueObservingOptions.New, context: nil)
}
override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
textViewHeightConstraint.constant = textView.contentSize.height
}
deinit {
self.textView.removeObserver(self, forKeyPath: "contentSize")
}
}
答案 1 :(得分:0)
您可以将文本视图的高度约束作为IBOutlet添加到文件中。加载后,它只是一个简单的更新:
CGSize sizeThatFits = [self.textView sizeThatFits:CGSizeMake(self.textview.frame.size.width, MAXFLOAT)];
self.textViewHeightConstraint.constant = sizeThatFits.height;