When I am fault finding sites with sticky iOS devices 75% of the time the issue is being caused by the access point's transmit power being too high and/or the access points are too close together.
Remember that a wireless client roams when it becomes uncomfortable with its current connection (normally triggered by a low RSSI/SNR and/or a rising retry rate) rather than there being a better access point to roam to. If the access point's transmit power is too high and/or the access points are too close together then the RSSI/SNR remains artifically high and the wireless client will not roam, commonly to its detriment. If this issue is extreme then the iOS device will disassociate even though the RSSI is very high.