Запрет UIScrollView для прокрутки, если к нему не прикасались - PullRequest
0 голосов
/ 03 сентября 2010

У меня следующая ситуация: UIScrollView содержит UIWebView. Я хочу, чтобы содержимое в веб-представлении было сенсорным, но представление с прокруткой не должно прокручиваться, если к нему не коснулись левого или правого края. Я вложил в подклассы UIScrollView и UIWebView, чтобы попытаться переопределить такие методы, как hitTest и pointInside, но пока нет пути.

Единственный частичный успех, который я имел, состоял в том, чтобы переопределить pointInside в моем UIScrollView и вернуть NO, если точка не была близка к краям. Затем UIScrollView прекращает прокрутку, но никакие касания не отправляются в UIWebView.

Ответы [ 6 ]

3 голосов
/ 08 сентября 2010

Прежде всего, вам не следует создавать подкласс UIWebView, поскольку документация специально не поощряет эту практику.Вы можете перехватить события касания, подклассифицируя другие классы, такие как UIWindow или, в вашем случае, UIScrollView.

Взгляните на эту статью , которая демонстрирует, как обнаружить сенсорные события на UIWebView.Я выбрал похожий, но немного другой подход: я вложил в подкласс UIView, который содержит UIWebView (и другие элементы управления), и переопределил метод hitTest:withEvent:.

1 голос
/ 11 сентября 2010

См. Пример кода scrollviewsuite от Apple. (Tapdetectingview)

Идея получения любых событий касания в просмотре прокрутки состоит в том, чтобы добавить к нему пользовательский интерфейс и получить там касания. Что касается прокрутки, вам должно быть хорошо с функциями делегирования scrollview, которые позволяют отменить прокрутку, если (в вашем примере ...) касания не соответствуют желаемым местам для начала прокрутки. Что касается веб-просмотра, который находится сверху .. Вы можете справиться с этим ..

PS. Эта ваша идея с обзором прокрутки и веб-обзором сверху и трогательным ... она не настолько удобна для пользователя ... возможно, вам следует пересмотреть.

Приветствие.

0 голосов
/ 13 августа 2013

Вот что я сделал:

static const float kEdgeScrollViewMargin = 8;

@implementation EdgeScrollView

- (BOOL)touchesShouldBegin:(NSSet *)aTouches
                 withEvent:(UIEvent *)aEvent
             inContentView:(UIView *)aView
{
    if([aTouches count] == 1) {
        CGPoint const touchLoc = [[aTouches anyObject] locationInView:self];
        float const edgeDistance = MIN(touchLoc.x - self.contentOffset.x,
                                       self.bounds.size.width - (touchLoc.x - self.contentOffset.x));
        if(edgeDistance <= kEdgeScrollViewMargin)
            return NO;
    }
    return YES;
}

@end
0 голосов
/ 13 сентября 2010

Я не перед своим Mac, так что это должно быть сделано в псевдокоде.

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
{
    NSRect noScroll = NSMakeRect(10,10,300,460); // No-Touch Zone
    NSSet *allTouches = [event allTouches];
    UITouch *touch = [[allTouches allObjects] objectAtIndex:0];
    CGPoint point = [touch locationInView:[self view];

    if (! NSPointInRect( NSPoint aPoint, NSRect aRect ))
    {
         // Point is NOT within the "No-Touch Zone" Proceed with Execution.
    }
}

Я частично украл это у iphonesdkarticles.com. Так, где этот метод идет ... Я думаю, во ViewController? Вам не нужно ничего подклассов с этим методом.

0 голосов
/ 10 сентября 2010

Может быть, вы можете это сделать, используя UIScrollView, затем добавьте в него UIView, а затем добавьте UIWebView в UIView.

0 голосов
/ 09 сентября 2010

Вы можете сделать, как вы сделали, и переопределить pointInside. Получить точку и событие, затем вызвать событие webView touchesEnded вручную и передать созданный вами объект прикосновения NSSet вместе с событием.

Тогда ваше веб-представление может принять меры.

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