嗨,我想在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>
答案 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()