scrollToTop не работает на iPhone, но работает на iPad - PullRequest
6 голосов
/ 17 декабря 2011

У меня два контроллера просмотра. Один просмотр прокрутки для управления страницей и один для детализации (вертикальная прокрутка).

Когда я нажимаю на строке состояния на iPhone, scrollToTop не работает, а в iPad работает scrollToTop.

Я уверен, что scrollView.scrollToTop - ДА. потому что я уже печатаю его.

Кто-нибудь знает, почему iPhone не работает scrollToTop?

Спасибо

Edit: Я пытаюсь позвонить делегату scrollView. в iPad этот делегат ее назвал. - (BOOL) scrollViewShouldScrollToTop: (UIScrollView *) scrollView

в айфоне это не называется. Я уже использую оба contentScrollView.delegate = self; Но iphone не работает: (

Редактировать: попробуйте создать подкласс UIWindow (не работает)

window.h

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
@interface Window : UIWindow
@end

Window.m

 #import "Window.h"

 @implementation Window

 - (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if ([event type] == UIEventTypeTouches && point.y < 250) {
    //Send Your Notification Here
    NSLog(@"KAROOO");
}
NSLog(@"HELLOWW");
return [super hitTest:point withEvent:event];
}
@end

AppDelegate.h

@property (nonatomic, strong) IBOutlet Window *window;

AppDelegate.m

@synthesize window = _window;

Ответы [ 4 ]

3 голосов
/ 17 декабря 2011

Насколько я понимаю, у вас есть 2 UIScrollViews одновременно на экране.

Из того, что я видел и испытал, На iOS 4 наличие 2-х UIScrollViews рядом дает неопределенное поведение. Один из прокрутки может прокручивать, иногда другой, иногда ни один.

В iOS 5, если у вас есть 2 UIScrollViews рядом, а затем нажмите в строке состояния «прокрутить вверх» UIScrollView справа «под вашим краном»

Я не знаю, как это работает, но это было моим наблюдением. iOS 5 умная !!

Если ваши UIScrollViews находятся один над другим, то, вероятно, поведение не определено. Я не проверял.

Надеюсь, это поможет.

Если вы все равно хотите, чтобы это работало, вот возможное решение.

Подкласс или Добавить категорию в UIWindow и добавить распознаватель жестов / или реализовать hitTest, который обнаруживает касание только для Y <20 и т. Д., А затем отправить его и прослушать это в вашем viewController и программно прокрутите UIScrollView наверх. </p>

EDIT

Реализуйте это в подклассе UIWindow (iPad)

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if ([event type] == UIEventTypeTouches && point.y < 20 && [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortrait) {
        NSLog(@"Portrait");
    } else if ([event type] == UIEventTypeTouches && point.y > 1004 && [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown) {
        NSLog(@"PortraitUpsideDown");
    } else if ([event type] == UIEventTypeTouches && point.x < 20 && [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft) {
        NSLog(@"LandscapeLeft");
    } else if ([event type] == UIEventTypeTouches && point.x > 748 && [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight) {
        NSLog(@"LandscapeRight");
    }
    return [super hitTest:point withEvent:event];
}
1 голос
/ 08 января 2014

Не знаю, что Apple курила, но по дизайну поведение на iPhone заметно отличается от iPad. Документация Apple содержит примечание «Особое мнение» следующим образом ...

На iPhone жест прокрутки вверх не действует, если имеется более одной прокруткипросмотреть на экране, для которого scrollsToTop установлено значение YES.

Поэтому на iPhone вы должны убедиться, что существует только один UIScrollView (или UITableView / UICollectionView / UIWebView и т. д.), который имеет scrollsToTop = YES.

Поскольку для scrollsToTop по умолчанию задано YES, вам необходимо явно установить scrollsToTop = NO для UIScrollView, которые вы не хотите прокручивать, когда пользователь нажимает на строку состояния.

1 голос
/ 19 июля 2012

В случае, если у вас есть более одного экземпляра UIScrollView (включая подклассы, например, UITableView и т. Д.) На одном экране, вам необходимо определить, какой из них следует воздействовать на событие scrollToTop.Это означает, что вам нужно пройти через эти экземпляры и установить для их свойства scrollToTop значение NO, кроме того, которое вы хотите сделать.Для меня это работало всегда.Если это не так, то из-за какого-то другого UIScrollView я не знал, что это там.В этом случае я просто прошел через все подпредставления, рекурсивно отключая свойство thet, и затем оно начало работать так, как предполагалось.Приветствия.:)

0 голосов
/ 01 октября 2013

Вот мое решение, основанное на ответе NSIntegerMax.Таким образом, нам не нужно заботиться об ориентации или иметь жестко закодированные значения.

объявить этот макрос

#define isInStatusBar(frame, point) (point.x >= frame.origin.x && point.x <= (frame.origin.x+frame.size.width) && point.y >= frame.origin.y && point.y <= (frame.origin.y+frame.size.height))

и реализовать метод:

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    CGRect frame = [[UIApplication sharedApplication] statusBarFrame];

    if ([event type] == UIEventTypeTouches && isInStatusBar(frame, point)) {
        [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationAppDidTouchStatusBar object:nil];
    }

    return [super hitTest:point withEvent:event];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...