{ "id": "98489", "key": "TIMOB-11510", "fields": { "issuetype": { "id": "1", "description": "A problem which impairs or prevents the functions of the product.", "name": "Bug", "subtask": false }, "project": { "id": "10153", "key": "TIMOB", "name": "Titanium SDK/CLI", "projectCategory": { "id": "10100", "description": "Titanium and related SDKs used in application development", "name": "Client" } }, "fixVersions": [ { "id": "13505", "description": "Release 3.0.0", "name": "Release 3.0.0", "archived": true, "released": true, "releaseDate": "2012-12-14" }, { "id": "14162", "description": "Release 3.1.0", "name": "Release 3.1.0", "archived": true, "released": true, "releaseDate": "2013-04-16" }, { "id": "14169", "description": "2012 Sprint 22 Core", "name": "2012 Sprint 22 Core", "archived": true, "released": true, "releaseDate": "2012-11-05" }, { "id": "14274", "description": "2012 Sprint 22", "name": "2012 Sprint 22", "archived": true, "released": true, "releaseDate": "2012-11-05" } ], "resolution": { "id": "1", "description": "A fix for this issue is checked into the tree and tested.", "name": "Fixed" }, "resolutiondate": "2012-10-30T18:39:19.000+0000", "created": "2012-08-01T07:37:02.000+0000", "priority": { "name": "Critical", "id": "1" }, "labels": [ "core", "developer-preview", "ios", "notable", "qe-testadded", "scroll", "slow", "tableview", "triage" ], "versions": [], "issuelinks": [ { "id": "22068", "type": { "id": "10003", "name": "Relates", "inward": "relates to", "outward": "relates to" }, "outwardIssue": { "id": "103365", "key": "TIMOB-11987", "fields": { "summary": "iOS: TableView row management makes it drastically slow", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "priority": { "name": "Medium", "id": "3" }, "issuetype": { "id": "1", "description": "A problem which impairs or prevents the functions of the product.", "name": "Bug", "subtask": false } } } }, { "id": "22809", "type": { "id": "10003", "name": "Relates", "inward": "relates to", "outward": "relates to" }, "inwardIssue": { "id": "104989", "key": "TIMOB-11773", "fields": { "summary": "Kitchen Sink: Views - An application hangs after scrolling down/up.", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "priority": { "name": "High", "id": "2" }, "issuetype": { "id": "1", "description": "A problem which impairs or prevents the functions of the product.", "name": "Bug", "subtask": false } } } }, { "id": "22080", "type": { "id": "10003", "name": "Relates", "inward": "relates to", "outward": "relates to" }, "inwardIssue": { "id": "103565", "key": "TIMOB-11523", "fields": { "summary": "Android: TableView - delete row cannot delete a row without giving it a number, but iOS can", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "priority": { "name": "High", "id": "2" }, "issuetype": { "id": "2", "description": "A new feature of the product, which has yet to be developed.", "name": "New Feature", "subtask": false } } } } ], "assignee": { "name": "mstepanov", "key": "mstepanov", "displayName": "Max Stepanov", "active": true, "timeZone": "America/Los_Angeles" }, "updated": "2012-12-04T18:51:53.000+0000", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "components": [ { "id": "10206", "name": "iOS", "description": "iOS Platform" } ], "description": "I am developing on the master branch (using my own fork).\r\nRecently i realised that my application (tableview) got amazingly slow scrolling.\r\nInvestigating the problem i discovered that it was the pull request #2473 that broke it.\r\nSo i decided to create an example that would definitively show it.\r\n\r\nI created a clone of the iphone gmail application.\r\nThe application, using sdk 2.0.2.GA or even 2.1.1.GA, works almost flawlessly. There s just a very little lag on the first scroll\r\n\r\nNow if you compile and run it using master branch, you ll see that the scrolling (on my iphone 4 at least), is very very bad. It gets better as you keep scrolling back and forth. But it never gets as smooth as with older sdks.\r\n\r\nI will take a look at this bug myself, but i really think we should correct this one.\r\n\r\nI have put the test project as attachment (because of images). \r\n", "attachment": [ { "id": "30212", "filename": "gmail_tv_test.zip", "author": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "created": "2012-08-01T07:37:02.000+0000", "size": 2342358, "mimeType": "application/zip" } ], "flagged": false, "summary": "iOS: TableView very slow", "creator": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "subtasks": [ { "id": "104923", "key": "TIMOB-11760", "fields": { "summary": "Make TableViewRow reuse conditional", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "priority": { "name": "High", "id": "2" }, "issuetype": { "id": "5", "description": "The sub-task of the issue", "name": "Sub-task", "subtask": true } } } ], "reporter": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "environment": "Ti 2.2.0 (master)\r\nios 5.1", "comment": { "comments": [ { "id": "215061", "author": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "body": "I am sorry to bump this one, but i think it s critical on ios. this should really be looked at before any release of SDk including pull request 2473\r\nhttps://github.com/appcelerator/titanium_mobile/pull/2473", "updateAuthor": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "created": "2012-08-17T23:44:28.000+0000", "updated": "2012-08-17T23:44:28.000+0000" }, { "id": "223774", "author": { "name": "ygbr", "key": "ygbr", "displayName": "Ygor Lemos", "active": true, "timeZone": "America/Sao_Paulo" }, "body": "I've been experience extreme tableView slowdowns on scrolling when using 3.0.0.v20121015133920 (regular tableView with Image Background).\n\nOn 2.1.3 GA it goes smooth...\n\nI think it may be a regression case.", "updateAuthor": { "name": "ygbr", "key": "ygbr", "displayName": "Ygor Lemos", "active": true, "timeZone": "America/Sao_Paulo" }, "created": "2012-10-16T14:28:22.000+0000", "updated": "2012-10-16T14:28:22.000+0000" }, { "id": "223775", "author": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "updateAuthor": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "created": "2012-10-16T14:34:36.000+0000", "updated": "2012-10-16T14:34:36.000+0000" }, { "id": "223942", "author": { "name": "mstepanov", "key": "mstepanov", "displayName": "Max Stepanov", "active": true, "timeZone": "America/Los_Angeles" }, "body": "PR submitted https://github.com/appcelerator/titanium_mobile/pull/3260\nTableView scrolling performance should be comparable to what it was in 2.1.3 while memory usage should remain stable and not increasing as number of rows displayed.", "updateAuthor": { "name": "mstepanov", "key": "mstepanov", "displayName": "Max Stepanov", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2012-10-17T06:41:00.000+0000", "updated": "2012-10-17T06:41:00.000+0000" }, { "id": "223945", "author": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "body": "Thanks Max. That s one step forward. I just hope we wont stop there!", "updateAuthor": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "created": "2012-10-17T07:03:17.000+0000", "updated": "2012-10-17T07:03:17.000+0000" }, { "id": "223955", "author": { "name": "ingo", "key": "ingo", "displayName": "Ingo Muschenetz", "active": true, "timeZone": "America/Los_Angeles" }, "body": "@max, will the PR also address TC-1384?", "updateAuthor": { "name": "ingo", "key": "ingo", "displayName": "Ingo Muschenetz", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2012-10-17T12:29:04.000+0000", "updated": "2012-10-17T12:29:04.000+0000" }, { "id": "223968", "author": { "name": "mstepanov", "key": "mstepanov", "displayName": "Max Stepanov", "active": true, "timeZone": "America/Los_Angeles" }, "body": "@Ingo, the other one is more like a feature request and not yet completely defined.", "updateAuthor": { "name": "mstepanov", "key": "mstepanov", "displayName": "Max Stepanov", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2012-10-17T15:51:31.000+0000", "updated": "2012-10-17T15:51:31.000+0000" }, { "id": "223969", "author": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "body": "@Max i agree it s not completely defined, but please do not ignore it ;)", "updateAuthor": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "created": "2012-10-17T15:53:50.000+0000", "updated": "2012-10-17T15:53:50.000+0000" }, { "id": "223970", "author": { "name": "ingo", "key": "ingo", "displayName": "Ingo Muschenetz", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Martin, thanks. What I'm trying to ascertain is if the issue in TC-1384 is a regression from a previous version (i.e. it worked fine in 2.1.3 but not in 3.0.0), or if it's a way of making things faster than they are now.", "updateAuthor": { "name": "ingo", "key": "ingo", "displayName": "Ingo Muschenetz", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2012-10-17T16:03:02.000+0000", "updated": "2012-10-17T16:03:02.000+0000" }, { "id": "223973", "author": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "body": "No it s not a regression in any way! Just a thought on another way to implement it\r\nand thank you!", "updateAuthor": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "created": "2012-10-17T16:32:56.000+0000", "updated": "2012-10-17T16:32:56.000+0000" }, { "id": "224707", "author": { "name": "ygbr", "key": "ygbr", "displayName": "Ygor Lemos", "active": true, "timeZone": "America/Sao_Paulo" }, "body": "Any news on this one?\r\n\r\n3.0.0 shouldn't be published with this performance issue... since it is critical, but I see the fix version set only for 3.1.x", "updateAuthor": { "name": "ygbr", "key": "ygbr", "displayName": "Ygor Lemos", "active": true, "timeZone": "America/Sao_Paulo" }, "created": "2012-10-23T15:04:13.000+0000", "updated": "2012-10-23T15:04:13.000+0000" }, { "id": "224708", "author": { "name": "ingo", "key": "ingo", "displayName": "Ingo Muschenetz", "active": true, "timeZone": "America/Los_Angeles" }, "body": "@Ygor--we will address this for 3.0.0. Note the \"merge-3.0.0\" label which indicates it will be backported to 3.0.", "updateAuthor": { "name": "ingo", "key": "ingo", "displayName": "Ingo Muschenetz", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2012-10-23T15:06:49.000+0000", "updated": "2012-10-23T15:06:49.000+0000" }, { "id": "224710", "author": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "updateAuthor": { "name": "farfromrefuge", "key": "farfromrefuge", "displayName": "Martin Guillon", "active": false, "timeZone": "Europe/Berlin" }, "created": "2012-10-23T15:09:41.000+0000", "updated": "2012-10-23T15:09:41.000+0000" }, { "id": "224933", "author": { "name": "mstepanov", "key": "mstepanov", "displayName": "Max Stepanov", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Test case for non-matching row hierarchies:\n{code}\nvar win = Ti.UI.createWindow();\nvar tableView = Ti.UI.createTableView();\nvar toolbar = createToolbar();\nvar data = [];\nvar selectedRows = {};\nvar nbSelected = 0;\n\nfunction createRow(c) {\n var row = Ti.UI.createTableViewRow({\n selectionStyle:'none'\n });\n row.selected = false;\n row.unread = !! Math.round(Math.random() * 1);\n row.starred = !! Math.round(Math.random() * 1);\n row.attachment = !! Math.round(Math.random() * 1);\n var important=Math.floor(Math.random()*5);\n var label=Math.floor(Math.random()*3);\n row.selectedBackgroundColor = '';\n row.height = 80;\n row.className = 'datarow';\n row.clickName = 'row';\n \n \n var selectButton = Ti.UI.createView({\n backgroundImage:'images/select_off.png',\n left:10,\n width:20,\n height:20,\n clickName:'select'\n });\n \n var viewCenter = Ti.UI.createView({\n layout:'vertical', \n left:40, \n right:40\n });\n\n var viewSenderDate = Ti.UI.createView({\n height:30,\n bottom:5\n });\n \n var senderView = Ti.UI.createLabel({\n color:'black',\n font:{fontSize:16,fontWeight:(row.unread?'bold':'normal')},\n left:0,\n top:0,\n height:Ti.UI.FILL,\n right:50,\n clickName:'user',\n text:'Fred Smith '\n });\n \n var attachmentView = Ti.UI.createView({\n backgroundImage:'images/button_attach.png',\n right:38,\n top:5,\n width:24,\n height:16,\n clickName:'attachment'\n });\n attachmentView.visible = row.attachment;\n \n var dateView = Ti.UI.createLabel({\n color:'#444',\n font:{fontSize:14,fontWeight:'normal'},\n width:35,\n top:0,\n right:0,\n height:20,\n clickName:'date',\n text:'7/31'\n });\n \n var viewimportanceSubject = Ti.UI.createView({\n height:20\n });\n \n var importanceView = Ti.UI.createView({\n left:0,\n width:16,\n height:10,\n clickName:'importance'\n });\n \n \n var subjectView = Ti.UI.createLabel({\n color:(row.unread?'black':'#444'),\n font:{fontSize:14,fontWeight:(row.unread?'bold':'normal')},\n left:20,\n top:0,\n height:Ti.UI.FILL,\n right:0,\n wordWrap:false,\n clickName:'subject',\n text:'This is a sample subject'\n });\n \n if (important === 0)\n {\n subjectView.left = 0;\n importanceView.visible = false;\n }\n else\n importanceView.backgroundImage = '/images/importance' + important + '.png';\n \n var viewmessageLabels = Ti.UI.createView({\n height:20\n });\n \n var messageView = Ti.UI.createLabel({\n color:'#444',\n font:{fontSize:14,fontWeight:'bold'},\n left:0,\n top:0,\n height:Ti.UI.FILL,\n wordWrap:false,\n clickName:'message',\n text:'This is a sample core message text which actually needs to be pretty long so that we see what we want to see'\n });\n \n // var labelsView = Ti.UI.createWebView({\n // color:'#444',\n // top:0,\n // height:24,\n // right:0,\n // wordWrap:false,\n // clickName:'labels'\n // });\n // labelsView.html = '
Label
';\n // labelsView.width = label*25;\n // messageView.right = labelsView.width;\n \n var starButton = Ti.UI.createView({\n right:10,\n width:20,\n height:20,\n clickName:'star'\n });\n starButton.backgroundImage = 'images/star_' + (row.starred?'on':'off') + '.png';\n \n viewSenderDate.add(senderView);\n viewSenderDate.add(attachmentView);\n viewSenderDate.add(dateView);\n \n viewimportanceSubject.add(importanceView);\n viewimportanceSubject.add(subjectView);\n \n viewmessageLabels.add(messageView);\n // viewmessageLabels.add(labelsView);\n \n viewCenter.add(viewSenderDate);\n if ((c % 10) != 0) {\n \tviewCenter.add(viewimportanceSubject);\n }\n viewCenter.add(viewmessageLabels);\n \n row.add(selectButton);\n row.add(viewCenter);\n row.add(starButton);\n \n row.select = function()\n {\n this.backgroundColor = '#D9E7FD';\n this.separatorColor = '#B9CFF5';\n this.selected = true;\n selectButton.backgroundImage = 'images/select_on.png';\n }\n \n row.unselect = function()\n {\n this.backgroundColor = this.unread?'white':'#efefef';\n this.separatorColor = '#777';\n this.selected = false;\n selectButton.backgroundImage = 'images/select_off.png';\n }\n \n row.star = function()\n {\n this.starred = true;\n starButton.backgroundImage = 'images/star_' + (this.starred?'on':'off') + '.png';\n }\n \n row.unstar = function()\n {\n this.starred = false;\n starButton.backgroundImage = 'images/star_' + (this.starred?'on':'off') + '.png';\n }\n \n row.unselect();\n return row;\n}\n \nvar updating = false;\nvar loadingRow = Ti.UI.createTableViewRow({\n height:80,\n title:\"Show more messages...\",\n clickName: 'loadingRow',\n color:'blue'\n});\n\nfunction addRows()\n{\n updating = true;\n tableView.deleteRow(loadingRow);\n var lastCurrentRow = data.length -1;\n var lastRow = 50;\n for (var c=0;c 0)\n// tableView.scrollToIndex(lastCurrentRow,{animated:false,position:Ti.UI.iPhone.TableViewScrollPosition.BOTTOM}); \n tableView.appendRow(loadingRow);\n updating = false;\n}\n\ntableView.addEventListener('click', function(e){\n if (e.source.clickName === 'loadingRow')\n addRows();\n else if (e.source.clickName === 'select')\n {\n if (e.row.selected)\n {\n delete selectedRows[e.index];\n e.row.unselect();\n nbSelected -= 1;\n toolbar.setNbSelected(nbSelected);\n if (nbSelected === 0)\n toolbar.hideMe();\n }\n else\n {\n selectedRows[e.index] = e.row;\n e.row.select();\n nbSelected += 1;\n toolbar.setNbSelected(nbSelected);\n if (nbSelected === 1) //first selected\n toolbar.showMe();\n }\n }\n else if (e.source.clickName === 'star')\n {\n if (e.row.starred)\n e.row.unstar();\n else\n e.row.star();\n }\n \n})\n\naddRows();\nwin.add(tableView);\nwin.add(toolbar);\n\nfunction createToolbar()\n{\n var toolbar = Ti.UI.createView({\n left:-1,\n right:-1,\n height:38,\n bottom:-1,\n borderColor:'#6E6E6F',\n borderWidth:1,\n backgroundGradient: {\n type: 'linear',\n startPoint: { x: '50%', y: 0 },\n endPoint: { x: '50%', y:'100%' },\n colors: [ { color: '#424245', offset: 0.0}, { color: '#181819', offset: 1.0 } ],\n backfillStart:true\n }\n });\n toolbar.transform = Ti.UI.create2DMatrix().translate(0,toolbar.height);\n\n \n var labelNbSelected = Ti.UI.createLabel({\n color:'white',\n textAlign:'center',\n font:{fontSize:14,fontWeight:'normal'},\n left:10,\n width:25,\n height:25,\n wordWrap:false,\n backgroundColor:'#48484A',\n borderRadius:2\n });\n \n toolbar.setNbSelected = function(_nb)\n {\n labelNbSelected.text = _nb;\n }\n \n var buttonUnselect = Ti.UI.createButton({\n image:'images/button_close.png',\n style:'plain',\n font:{fontSize:15,fontWeight:'normal'},\n right:5,\n width:30,\n height:30\n });\n \n buttonUnselect.addEventListener('click', function(_event)\n {\n if (nbSelected === 0) return;\n for (var index in selectedRows)\n {\n selectedRows[index].unselect();\n }\n selectedRows = {};\n nbSelected = 0;\n toolbar.setNbSelected(0);\n toolbar.hideMe();\n });\n \n \n toolbar.showMe = function()\n {\n var animation = Ti.UI.createAnimation();\n animation.transform = Ti.UI.create2DMatrix();\n toolbar.animate(animation);\n }\n \n toolbar.hideMe = function()\n {\n var animation = Ti.UI.createAnimation();\n animation.transform = Ti.UI.create2DMatrix().translate(0,toolbar.height);\n toolbar.animate(animation);\n }\n \n toolbar.add(labelNbSelected);\n toolbar.add(buttonUnselect);\n return toolbar;\n}\nwin.add(toolbar);\n\nwin.open();\n{code}", "updateAuthor": { "name": "mstepanov", "key": "mstepanov", "displayName": "Max Stepanov", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2012-10-25T17:09:24.000+0000", "updated": "2012-10-25T17:09:24.000+0000" }, { "id": "225555", "author": { "name": "blainhamon", "key": "blainhamon", "displayName": "Blain Hamon", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Pull merged.", "updateAuthor": { "name": "blainhamon", "key": "blainhamon", "displayName": "Blain Hamon", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2012-10-30T18:39:19.000+0000", "updated": "2012-10-30T18:39:19.000+0000" }, { "id": "229876", "author": { "name": "oromero", "key": "oromero", "displayName": "Olga Romero", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Closing as fixed.\nVerified and tested with:\nTitanium Studio, build: 3.0.0.201211301903\nTitanium SDK, build: 3.0.0.v20121130200208\nDevices:\niPad mini iOS 6.0.1\niPad4 iOS 6.0\niPhone5 iOS 6.0", "updateAuthor": { "name": "oromero", "key": "oromero", "displayName": "Olga Romero", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2012-12-04T18:43:18.000+0000", "updated": "2012-12-04T18:43:18.000+0000" } ], "maxResults": 16, "total": 16, "startAt": 0 } } }