Сравнение местоположения UITouch к прямоугольнику UIImageView

У меня есть следующий код, чтобы определить, ли касание в представлении изображения в моей ячейке таблицы. Однако это не работает. Я сравнил два с CGRectContainsPoint однако, он не работает. Вот код:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event    
{
     // Declare the touch and get it's location

     UITouch *touch = [touches anyObject];

     CGPoint touchLocation = [touch locationInView:self];

     if (CGRectContainsPoint(myImageView.frame, touchLocation))
     {
        NSLog(@"Tapped image view");
     }    
}

Спасибо за справку!

6
задан Peter Hosey 8 February 2010 в 12:24
поделиться

2 ответа

Просто проведите массив в правильном порядке. Если у вас относительно небольшие массивы, самое простое решение - создать новый массив во время этой прогулки.

Решение будет иметь форму:

$rows = count($arr);
$cols = count($arr[0]); // assumes non empty matrix
$ridx = 0;
$cidx = 0;

$out = array();

foreach($arr as $rowidx => $row){
    foreach($row as $colidx => $val){
        $out[$ridx][$cidx] = $val;
        $ridx++;
        if($ridx >= $rows){
            $cidx++;
            $ridx = 0;
        }
    }
}
-121--3286650-

Я видел много Singleton разговоров, поэтому я могу только рекомендовать взглянуть на Александреску работы .

Однако я не уверен, что вам действительно нужен Singleton там. Потому что если вы это сделаете, вы предполагаете, что все ваши звонки будут делиться государством... так ли это? Действительно ли при вызове библиотеки через другой экземпляр Wrapper необходимо получить состояние, в котором ее установил последний вызов?

Если нет, необходимо сериализовать доступ и повторно инициализировать данные каждый раз.

class Wrapper
{
public:
  Wrapper() { lock(Mutex()); do_init_c_library(); }
  ~Wrapper() { do_clean_up_c_library(); unlock(Mutex()); }

private:
  static Mutex& Mutex() { static Mutex MMutex; return MMutex; }
}; // class Wrapper

Довольно просто... хотя необходимо убедиться, что Mutex инициализирован правильно (один раз) и работает до тех пор, пока больше не понадобится.

Boost предлагает объекты для после выпуска , и поскольку мы используем подход на основе стека с MMutex , это не должно идти наперекосяк... Я думаю (гул).

-121--3375289-

Однако это не работает.

Пожалуйста, уточните.

  UITouch * touch = [касается anyObject];

Почему бы не изучить каждое касание, а не просто случайный * выбор из них?

* Документация для anyObject говорит о том, что вам не гарантировано, какой именно он вам даст. Вам даже не гарантировано, что это будет случайным; это может быть один и тот же объект каждый раз. Закон Мерфи гласит, что, независимо от того, случайный он или нет, он будет неправильным.

  CGPoint touchLocation = [touch locationInView: self];
if (CGRectContainsPoint (myImageView.frame, touchLocation))

Ваша рамка находится в системе координации Вашего руководителя; [touch locationInView: self] возвращает точку касания в вашей координационной системе. Необходимо выполнить тестирование в пределах границ , которые находятся в системе координат. Эта разница объясняется в документации.

26
ответ дан 8 December 2019 в 03:39
поделиться

Проблема в том, что вам нужно вызвать [touch locationInView: myImageView], чтобы получить точку в системе координат представлений изображений. Затем проверьте, не попал ли он в кадр.

1
ответ дан 8 December 2019 в 03:39
поделиться