根据滚动视图上的内容增加表格视图的高度

时间:2019-03-06 15:36:08

标签: ios swift uitableview uiscrollview uikit

嗨,我想在scrollview上动态增加tableview的高度。 即使无法正常工作,我也会尝试以下代码

这里的项目是tableview数据数组

<head>
    <title>Amazon Lex for test</title>
    <script src="https://sdk.amazonaws.com/js/aws-sdk-2.41.0.min.js"></script>
    <style language="text/css">
        input#wisdom {
            padding: 4px;
            font-size: 1em;
            width: 400px
        }

        input::placeholder {
            color: #ccc;
            font-style: italic;
        }

        p.userRequest {
            margin: 4px;
            padding: 4px 10px 4px 10px;
            border-radius: 4px;
            min-width: 50%;
            max-width: 85%;
            float: left;
            background-color: #7d7;
        }

        p.lexResponse {
            margin: 4px;
            padding: 4px 10px 4px 10px;
            border-radius: 4px;
            text-align: right;
            min-width: 50%;
            max-width: 85%;
            float: right;
            background-color: #bbf;
            font-style: italic;
        }

        p.lexError {
            margin: 4px;
            padding: 4px 10px 4px 10px;
            border-radius: 4px;
            text-align: right;
            min-width: 50%;
            max-width: 85%;
            float: right;
            background-color: #f77;
        }
    </style>
</head>

<body>
    <h1 style="text-align:  left">Easy Join Chat Bot</h1>
    <div id="conversation" style="width: 400px; height: 400px; border: 1px solid #ccc; background-color: #eee; padding: 4px; overflow: scroll"></div>
    <form id="chatform" style="margin-top: 10px" onsubmit="return pushChat();">
        <input type="text" id="wisdom" size="80" value="" placeholder="Please enter a question or keyword.">
    </form>
    <script type="text/javascript">
        // set the focus to the input box
        document.getElementById("wisdom").focus();

        AWS.config.region = 'us-east-1'; // Region

        var lexruntime = new AWS.LexRuntime();

        var lexUserId = 'chatbot-demo' + Date.now();
        var sessionAttributes = {};

        function pushChat() {

            // if there is text to be sent...
            var wisdomText = document.getElementById('wisdom');
            if (wisdomText && wisdomText.value && wisdomText.value.trim().length > 0) {

                // disable input to show we're sending it
                var wisdom = wisdomText.value.trim();
                wisdomText.value = '...';
                wisdomText.locked = true;

                // send it to the Lex runtime
                var params = {
                    botAlias: 'EasyJoinChatBot',
                    botName: 'EasyJoinChatBot',
                    inputText: wisdom,
                    userId: lexUserId,
                    sessionAttributes: sessionAttributes
                };
                showRequest(wisdom);
                lexruntime.postText(params, function(err, data) {
                    if (err) {
                        console.log(err, err.stack);
                        showError('Error:  ' + err.message + ' (see console for details)')
                    }
                    if (data) {
                        // capture the sessionAttributes for the next cycle
                        sessionAttributes = data.sessionAttributes;
                        // show response and/or error/dialog status
                        showResponse(data);
                    }
                    // re-enable input
                    wisdomText.value = '';
                    wisdomText.locked = false;
                });
            }
            // we always cancel form submission
            return false;
        }

        function showRequest(daText) {

            var conversationDiv = document.getElementById('conversation');
            var requestPara = document.createElement("P");
            requestPara.className = 'userRequest';
            requestPara.appendChild(document.createTextNode(daText));
            conversationDiv.appendChild(requestPara);
            conversationDiv.scrollTop = conversationDiv.scrollHeight;
        }

        function showError(daText) {

            var conversationDiv = document.getElementById('conversation');
            var errorPara = document.createElement("P");
            errorPara.className = 'lexError';
            errorPara.appendChild(document.createTextNode(daText));
            conversationDiv.appendChild(errorPara);
            conversationDiv.scrollTop = conversationDiv.scrollHeight;
        }

        function showResponse(lexResponse) {

            var conversationDiv = document.getElementById('conversation');
            var responsePara = document.createElement("P");
            responsePara.className = 'lexResponse';
            if (lexResponse.message) {
                responsePara.appendChild(document.createTextNode(lexResponse.message));
                responsePara.appendChild(document.createElement('br'));
            }
            if (lexResponse.dialogState === 'ReadyForFulfillment') {
                responsePara.appendChild(document.createTextNode(
                    'Ready for fulfillment'));
                // TODO:  show slot values
            } else {
                responsePara.appendChild(document.createTextNode(
                    '(' + lexResponse.dialogState + ')'));
            }
            conversationDiv.appendChild(responsePara);
            conversationDiv.scrollTop = conversationDiv.scrollHeight;
        }
    </script>
</body>

</html>

4 个答案:

答案 0 :(得分:1)

有时使用tableview的内容大小设置常量不会正确更新高度,因为tableview正在重新加载或自行计算

什么是最好的地方?

如果您有静态数据,那么viewDidAppear可能是最好的地方

 override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        self.view.layoutIfNeeded()
        self.heightConstraint.constant = self.tableView.contentSize.height
        self.view.layoutIfNeeded()

  }

如果您的数据是动态的,例如调用API。然后在主队列内的响应块内。

DispatchQueue.main.async {
        self.tableView.reloadData()
        self.view.layoutIfNeeded()
        self.heightConstraint.constant = self.tableView.contentSize.height 
        self.view.layoutIfNeeded()
 }

重要:与内容大小直接相关的因素是estimateRowHeight,因此,如果确定单元格的高度,则在行数固定的情况下直接应用

希望对您和面临相同问题的其他人有帮助

答案 1 :(得分:0)

当前,您正在rewardPointsApi()之后的上方编写代码,如果您正在等待对此方法的响应(如果它的异步请求您的代码不起作用),则逻辑将起作用。 在tableView中重新加载数据后,您需要在rewardPointsApi()的响应中添加以下行。

        tableviewheight.constant = tableview.contentSize.height

答案 2 :(得分:0)

从api获得响应后使用以下代码,首先将数据分配给item数组,然后重新加载表格视图并设置高度限制为UItableview 并禁用tableview自滚动,请参见以下代码。

if(items != nil)
{
     DispatchQueue.main.async {
         tableView.reloadData()
         tableviewheight.constant = tableview.contentSize.height
         tableView.isScrollEnabled = false
         self.view.layoutIfNeeded()
     }
 }

答案 3 :(得分:0)

在委托方法中,根据表格设置约束高度 查看内容大小

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    self.constraint_height.constant = self.tblview.contentSize.height
}

在重新加载后,如果需要获取api响应,请查看布局

 self.tblview.reloadData()
 self.view.layoutIfNeeded()
 self.constraint_height.constant = self.tblview.contentSize.height
 self.view.layoutIfNeeded()