Как передать штрихи из UIView в UIScrollView - PullRequest
5 голосов
/ 20 сентября 2011

Аналогично этой теме и многим другим, у меня есть контроллер представления с файлом NIB, который имеет такую ​​компоновку ...

  • а. UIView (480 x 320) - сохраняет фоновое изображение
  • б. UIScrollView (480 x 220) - это скроллвью выбора уровня
  • с. UIView (480 x 320) - содержит на переднем плане анимированную графику

Все три пункта выше являются подпредставлениями основного вида в NIB. UIView (c) - полный размер экрана iPhone и верхняя часть иерархии. На нем я поместил символ, который анимируется на основе текущей позиции касания в этом представлении. Однако проблема в том, что с этим видом, получающим прикосновения, я не могу получить прикосновения к ScrollView (b) под ним. Мне все еще нужно использовать касания в (c), но также необходимо передать соответствующие касания / пролистывания в UIScrollView ниже.

Может кто-нибудь посоветовать, как это можно сделать? Я читал различные посты об использовании hittest, но не хочу полностью компенсировать прикосновения, мне просто нужно переслать их после, чтобы прокрутка по-прежнему работала как обычно.

Спасибо

Ответы [ 3 ]

1 голос
/ 15 июля 2013

Вот более простые решения, которые хорошо сработали для меня:

В представлении C (представление переднего плана над UIScrollView) установите ширину и высоту равными 0 (чтобы представление больше не было технически включено).верхнюю часть прокрутки) и установите clipsToBounds = NO (чтобы содержимое представления C по-прежнему отображалось поверх прокрутки).Это сработало как обаяние для меня.

 self.viewC.clipsToBounds = NO;
 CGRect frame = self.viewC.frame;
 self.viewC.frame = CGRectMake(frame.origin.x, frame.origin.y, 0, 0);

Обратите внимание, что если представление C содержит интерактивные элементы управления, они больше не будут работать.

1 голос
/ 20 сентября 2011

Если бы это был я, я бы назначил scrollView в качестве делегата вида сверху. Это, конечно, потребовало бы, чтобы вид сверху представлял собой пользовательский подкласс UIView, поэтому вы можете установить

id delegate; 

и

@property (nonatomic, assign) id delegate;

в заголовочном файле. Затем вы должны установить scrollView в качестве делегата с чем-то вроде

[topView setDelegate:scrollView];

После этого вы можете отправлять сообщения (в вашем случае, сенсорные события) в scrollView, когда они необходимы. Если, например, вы хотите отправить все события touchBegan, вы получите следующее:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.delegate touchesBegan:touches withEvent:event];
}

Конечно, если вы хотите, чтобы только определенные события передавались, вы должны настроить параметры в методах, чтобы указать, когда вызывать [self.delegate ....] или [super ....]. Последний будет выполнять действие для представления, а не в scrollView. Я надеюсь, что это поможет

0 голосов
/ 10 января 2013

Подкласс UIScrollVeiw и переопределить touchesShouldCancelInContentView: метод, подобный этому:

-(BOOL)touchesShouldCancelInContentView:(UIView *)view
{

    if ([view isKindOfClass:[UIButton class]]) {//or whatever class you want to override
        return YES;
    }

    if ([view isKindOfClass:[UIControl class]]) {
        return NO;
    }

    return YES;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...