0

私はTTLauncherView自分のアプリの一種のホーム画面として使用していますが、1ページ分のアイコンしかありません。TTLauncherViewでアイコンを「次のページ」にドラッグできないようにするにはどうすればよいですか?最大ページ数(この場合は1ページ)を設定したい。

(編集: 短い話、私はサブクラス化beginEditingした、以下の答えを参照してください。)。

が呼び出されたときにページが追加される理由はわかりますがbeginEditing、フレームワークコードを編集したくありません。(そのため、新しいバージョンに更新するのが難しくなります。)実装方法に依存する必要がある場合は、その1つのメソッドをサブクラス化してオーバーライドしないこともお勧めします。(私は、カテゴリがクリーンであれば、サブクラス化またはカテゴリの追加に反対していません。)

scrollView.scrollEnabledのコールバックメソッドlauncherViewDidBeginEditingでNOに設定しようとしましTTLauncherViewDelegateたが、編集モードでは機能せず、理由がわかりません。

を設定してタッチイベントをインターセプトするために、ブロッカーUIViewをスクロールビューに追加してみました。これは正常に機能しuserInteractionEnabled=NOます。TTLauncherItemsどういうわけか、次のページへのドラッグを無効にする必要があります。

contentSizeまた、スクロールビューのをに設定してみましたboundslauncherViewDidBeginEditing、それもうまくいかなかったようです。

もっと良い方法はありますか?

ジェスチャーをブロックしようとしました:

- (void)setLauncherViewScrollEnabled:(BOOL)scrollEnabled {
        if (scrollEnabled) {
            [self.scrollViewTouchInterceptor removeFromSuperview];
            self.scrollViewTouchInterceptor = nil;
        } else {
            // iter through the kids to get the scrollview, put a gesturerecognizer view in front of it
            UIScrollView *scrollView = [launcherView scrollViewSubview];
            self.scrollViewTouchInterceptor = [UIView viewWithFrame:scrollView.bounds]; // property retains it
            UIView *blocker = self.scrollViewTouchInterceptor;
            [scrollView addSubview:scrollViewTouchInterceptor];
            [scrollView sendSubviewToBack:scrollViewTouchInterceptor];
            scrollViewTouchInterceptor.userInteractionEnabled = NO;
        }
    }

参考:TTLauncherView.m

- (void)beginEditing {
    _editing = YES;
    _scrollView.delaysContentTouches = YES;

    UIView* prompt = [self viewWithTag:kPromptTag];
    [prompt removeFromSuperview];

    for (NSArray* buttonPage in _buttons) {
        for (TTLauncherButton* button in buttonPage) {
            button.editing = YES;
            [button.closeButton addTarget:self action:@selector(closeButtonTouchedUpInside:)
                         forControlEvents:UIControlEventTouchUpInside];
        }
    }

    // Add a page at the end
    [_pages addObject:[NSMutableArray array]];
    [_buttons addObject:[NSMutableArray array]];
    [self updateContentSize:_pages.count];

    [self wobble];

    if ([_delegate respondsToSelector:@selector(launcherViewDidBeginEditing:)]) {
        [_delegate launcherViewDidBeginEditing:self];
    }
}
4

2 に答える 2

2

beginEditingオーバーライドするのTTLauncherViewが最善の策だと思います。実際に触れているのは1つのメソッド(およびそのメソッドの数行のみ)だけなので、時が来たときにアップグレードすることはそれほど悪くないはずです。そのメソッドは明示的に余分なページを追加するので、その特定のコードを編集せずにそれを回避する方法がわかりません

于 2011-04-14T21:58:31.197 に答える
0

Andrew Flynnが彼の回答で示唆したように、編集モードに入るときにbeginEditing余分なページ追加を削除するメソッドをサブクラス化してオーバーライドすることで、それを機能させることができました。TTLauncherView

私が抱えている問題の1つはupdateContentSize、サブクラスの(プライベート)メソッドを呼び出すことで発生する警告を削除する方法がわからないことです。にキャストしてみましたidが、警告は削除されませんでした。出来ますか?

編集performSelector:プライベートクラスにメッセージを送信するためにを使用して警告を削除することができました。(以前は、メソッドを介してプリミティブを渡すことができるようにperformSelector:withIntラップするカテゴリメソッドを作成していました。これにより、これが非常に便利になります。)NSInvocationperformSelector

// MyLauncherView.h
@interface MyLauncherView : TTLauncherView {
    NSInteger _maxPages;
}

@property (nonatomic) NSInteger maxPages;

@end




// MyLauncherView.m
@implementation MyLauncherView
@synthesize maxPages = _maxPages;

- (void)beginEditing {
    [super beginEditing];

    // ignore unset or negative number of pages
    if (self.maxPages <= 0) {
        return;
    }

    // if we've got the max number of pages, remove the extra "new page" that is added in [super beginEditing]
    if ([_pages count] >= self.maxPages ) {
        [_pages removeLastObject];

        [self updateContentSize:_pages.count];   // this has a compiler warning

        // I added this method to NSObject via a category so I can pass primitives with performSelector
        // [self performSelector:@selector(updateContentSize:) withInt:_pages.count waitUntilDone:NO];

    }
}
于 2011-04-14T22:34:48.237 に答える