使用VoiceOver滑动时,如何禁用UITableView的自动滚动?

时间:2016-07-07 19:26:08

标签: ios uitableview uiscrollview uiaccessibility

我有一个tableview,每个单元格都包含一个collectionView(滚动禁用)。使用VoiceOver向左或向右滑动时,焦点会以意想不到的方式移动。我想阻止VoiceOver滚动tableview,以便我可以实现自定义滚动行为。

1 个答案:

答案 0 :(得分:0)

如果您希望语音跳过表格视图,则无法通过语音访问表格视图。你可以通过制作

来做到这一点
      //the queue is ConcurrentLinkedQueue
      static Map<String, Queue<MsgInfo>> queueReadBucketNextMessageIds = new ConcurrentHashMap<String, Queue<MsgInfo>>();
  private final Map<String,ReentrantReadWriteLock > readWriteLockMap = new ConcurrentHashMap<>();    
     //Applying read write ReentrantLock Lock to improve performance as number of db read op decreases when the cache  will have around 500 messgeInfos
        public MsgInfo fetchAndMoveMessageInfo(String queueName,
                Date dequeuetime, Date dequeueMinute) {
            getReadWriteLock(queueName).readLock().lock(); //acquire read lock
            if (!hasMessageInfo(queueName)) {
                getReadWriteLock(queueName).readLock().unlock(); //unlock read lock
                getReadWriteLock(queueName).writeLock().lock(); //acquire write lock
                // Acquired writeLock
                try {
                    if (!hasMessageInfo(queueName)) {
                        return getDequeueMessageInfo(queueName, dequeuetime,
                                dequeueMinute); //Form this I am invoking a method getReadBucketForQueue which is showing contention. See below JFR contention. How ??
                    }
                    getReadWriteLock(queueName).readLock().lock(); //unlock write lock

                } finally {
                    getReadWriteLock(queueName).writeLock().unlock(); //unlock read lock
                }

            }
            try {
                return readAndHideMessageInfo(queueName, dequeuetime, dequeueMinute);
            } finally {
                getReadWriteLock(queueName).readLock().unlock();
            }
        }

         private boolean hasMessageInfo(String queueName) {
            boolean hasMessageInfo = false;
            if (queueReadBucketNextMessageIds.containsKey(queueName)) {
                Queue<MsgInfo> messageInfoQueue = queueReadBucketNextMessageIds
                        .get(queueName);
                synchronized (messageInfoQueue) {
                    hasMessageInfo = !messageInfoQueue.isEmpty();
                }
            }
        private MsgInfo readAndHideMessageInfo(String queueName, Date dequeuetime,
                Date dequeueMinute) {
            MsgInfo messageInfo = queueReadBucketNextMessageIds.get(queueName)
                    .poll();
            if (messageInfo != null)
                //perform a db operation here to move 
            return messageInfo;
        }

private ReentrantReadWriteLock getReadWriteLock(String queueName) {
        ReentrantReadWriteLock readWriteLock = readWriteLockMap.get(queueName);
        if (readWriteLock == null) {
            log.debug("getting readWriteLock for newly created queue {}",
                    queueName);
            ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
            readWriteLock = readWriteLockMap.putIfAbsent(queueName, lock);
            if (readWriteLock == null)
                readWriteLock = lock;
        }
        return readWriteLock;
    }       
    Stack Trace  of JFR contention                                                                            Count Duration
    com.owmessaging.qserv.service.impl.QueueServiceHelper.setReadBucketForQueue(String, List)                5,134  8 min 39 sec
       com.owmessaging.qserv.service.impl.QueueServiceHelper.getDequeueMessageInfo(String, Date, Date)       5,125  8 min 39 sec
          com.owmessaging.qserv.service.impl.QueueServiceHelper.fetchAndMoveMessageInfo(String, Date, Date)  5,125  8 min 39 sec
             com.owmessaging.qserv.service.impl.QueueServiceImpl.dequeue(String)                             5,125  8 min 39 sec

       com.owmessaging.qserv.service.impl.QueueServiceHelper.getReadBucketForQueue(String)                       9  1 sec 245 ms (How come this method is showing contention?clueless ?)
          com.owmessaging.qserv.service.impl.QueueServiceHelper.getDequeueMessageInfo(String, Date, Date)        9  1 sec 245 ms
             com.owmessaging.qserv.service.impl.QueueServiceHelper.fetchAndMoveMessageInfo(String, Date, Date)   9  1 sec 245 ms
                com.owmessaging.qserv.service.impl.QueueServiceImpl.dequeue(String) 9   1,245,024,161

或者您可以使用 tableView.isAccessibilityElement=NO;

自定义视图中的辅助功能元素
accessibilityElements

通过这种方式,您还可以更改可访问元素的顺序。

如果您不希望可以访问您的tableview,请从上面的数组中删除tableview。

 self.view.accessibilityElements=@[myview,mytableview,mybutton];