2011-12-17 24 views
6

私は2つのView Controllerを持っています。ページコントロールのための1つのスクロールビューとディテールのためのスクロールビュー(垂直スクロール)。scrollToTopはiPhoneでは動作しませんが、iPad上で動作しています

iPhoneのステータスバーをクリックすると、scrollToTopが機能しなくなり、iPadではscrollToTopが機能しています。

私は、scrollView.scrollToTopがYESであることを確信しています。私はすでにそれを印刷しているからです。

誰でもiPhoneのscrollToTopが機能しない原因を知っていますか?私はscrollViewデリゲートを呼び出すことによって試す :

はあなたに

編集ありがとうございました。 iPadの が呼び出されました。 - (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView

iPhoneでは呼び出されません。 私はすでに両方を使用しています 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; 

答えて

3

私はあなたが画面上に同時に2 UIScrollViewsを持って理解して何から。私は側で2 UIScrollViews側を持つのiOS 4には、経験豊富な&、 を見てきたものから、

は未定義の動作を提供します。スクロールビューの1つがスクロールすることがあります。 iOSの5で

あなたが並んで2 UIScrollViews側を持っているし、「あなたの蛇口の下」UIScrollViewの権利「を先頭にスクロールし、」ステータスバーをタップした場合

を私はこれがどのように動作するかわかりませんが、これはされています私の観察。 iOS 5はスマートです!

UIScrollViewsが1つ上のものである場合、動作はおそらく未定義です。私はチェックしていない。

これが役に立ちます。

とにかく動作させたい場合は、ここでは解決策があります。その後、

だけY < 20用のタップを検出サブクラス UIWindowのカテゴリを追加し、ジェスチャー認識を追加/または実装hitTestなど、それはあなたのViewControllerと、プログラムでスクロールしてこれに通知を送信し、聞いていUIScrollViewを先頭に追加します。

EDIT

必要に同一画面上(UITableViewなどを例えばサブクラスを含む)UIWindowサブクラス(アプリ)あなたは1つのUIScrollViewインスタンス、より多くを持っている場合は

- (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]; 
} 
+0

私のiPhoneのios 5では動作しません。 ipadでは4.3と5の両方が動作しています。 UIWindowにカテゴリを追加してジェスチャ認識機能を追加するにはどうすればよいですか? –

+0

UIWindowサブクラスに入れるコードを追加しました – NSIntegerMax

+0

私の質問をuiwindowサブクラスで編集しました。あれは正しいですか?コードが正しい場合、nslogは出力されません。 –

1

でこれを実装しますscrollToTopイベントに作用するものを定義します。つまり、そのインスタンスを通過して、そのインスタンスを行う必要がある場合を除いて、scrollToTopプロパティをNOに設定する必要があります。私にとってはいつも働いていた。そうでない場合は、他のUIScrollViewのために私はそれがあることを知らなかったからです。その場合、私はちょうどthetプロパティを再帰的に無効にするすべてのサブビューを介して歩いて、それはespectとして動作するようになった。 乾杯。 :)

0

ここは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]; 
} 
1

は、Appleが喫煙されたのか分からないが、設計により、iPhone上で動作がiPadから明らかに異なります。 Apple's documentationは、次のように... iPhoneで

を「特別Condsideration」注記を含んでいますscrollsToTopがに設定されている画面上の1つのスクロールビューより 以上がある場合は、スクロール・ツー・トップジェスチャーは効果がありませんはい。

だからiPhoneに、あなたはその scrollsToTop = YESを持っているだけで、これまで1 UIScrollViewの(またはのUITableView/UICollectionView /のUIWebViewなど)があることを確認する必要があります。

scrollsToTopはデフォルトでYESに設定されているため、ユーザーがステータスバーをタップしたときにスクロールしたくないUIScrollViewには、scrollsToTop = NOを明示的に設定する必要があります。

関連する問題