具有动态标签,textview等的XCODE / Swift Autolayout ScrollView。如何基于textview设置scrollview高度

时间:2015-04-14 07:36:53

标签: ios swift uiscrollview uitextview

我正在使用: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)

Screenshot of design

Constraints

2 个答案:

答案 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"];
}

要实现此功能,您必须确保从textViewscrollView具有顶部和底部偏移约束。

如果您需要更多帮助,请告诉我。


更新 - Swift

如果您使用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;