2011-10-11 1 views
11

私は構築したWebアプリケーションと一緒に行くためにアプリケーションを構築しています。これはスレッド化されたコメントシステムを備えています。iOS用のスレッドコメントシステムを設計する

私はこのスレッドビューを構築するための最良の方法は何だろうと思っています。アコーディオンスタイルのコントロールを作成する比較的簡単な方法はありますか?

私は本当にエイリアンブルーアプリはそれをしないと、UI & UXは非常に滑らかであるかのように:

enter image description here

  • 誰もがこれらが構築されている方法任意のアイデアを持っていますか?
  • カスタムUIViewをサブビューとして追加するのが最善の方法でしょうか?その場合は、どのように '折りたたみ'スタイルの機能を実装しますか?

答えて

8

私は、各コメントを含むUIViewサブクラスを作成することをお勧めします。展開/折りたたむにはトグルボタンが必要です。開いた状態では、フレームサイズをコンテンツのサイズ(任意の埋め込み)に設定します。サブコメントの配列が含まれていて、最初は折りたたまれている(とトグルボタンとして表示される)展開時にUIViewサブクラスを追加します(折りたたみ時には削除します)。各コメントのビューはそのサイズを知っているように、サブビューを削除枠を設定し、ちょうど逆で崩壊すると、トグルボタン(プラスパディング)

の絶頂であることを、あなたは、コンテンツサイズとUIScrollViewの中で全体を置くことができます拡張/縮小の性質にかかわらずスクロールを許可するコメントビューサイズの合計に設定されます。

このアイデアのための部分的な実装:

Comment.h

#import <Foundation/Foundation.h> 

@interface Comment : NSObject { 
    NSMutableArray* subComments; 
    NSString* comment; 
} 

@property (nonatomic, retain) NSMutableArray* subComments; 
@property (nonatomic, retain) NSString* comment; 

@end 

Comment.m

#import "Comment.h" 

@implementation Comment 
@synthesize comment, subComments; 

-(id)init 
{ 
    self = [super init]; 
    if (self) 
    { 
     subComments = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 

@end 

CommentView.h

#import <UIKit/UIKit.h> 

@interface CommentView : UIView { 
    UIButton* toggle; 
    NSMutableArray* subComments; 
    NSString* commentText; 
    UITextView* comment; 
    BOOL expanded; 
} 
@property (strong, nonatomic) NSMutableArray* subComments; 
@property (strong, nonatomic) NSString* commentText; 


- (void) expand; 
- (void) collapse; 
- (void) toggleState; 

@end 

CommentView.m

#import "CommentView.h" 


@implementation CommentView 
@synthesize subComments,commentText; 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    [self setBackgroundColor:[UIColor whiteColor]]; 
    expanded = NO; 
    toggle = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    [toggle setTitle:@"Toggle" forState:UIControlStateNormal]; 
    [toggle addTarget:self action:@selector(toggleState) forControlEvents:UIControlEventTouchUpInside]; 
    CGRect curentFrame = self.frame; 
    curentFrame.size.height = toggle.frame.size.height + 10; 
    [self setFrame:curentFrame]; 

    curentFrame = toggle.frame; 
    curentFrame.origin.y = 5; 
    curentFrame.origin.x = 5; 
    [toggle setFrame:curentFrame]; 
    [self addSubview:toggle]; 
    [self collapse]; 

    return self; 
} 

- (void) toggleState 
{ 
    if (expanded) 
    { 
     [self collapse]; 
    } 
    else 
    { 
     [self expand]; 
    } 
} 

- (void) expand 
{ 
    comment = [[UITextView alloc] init]; 
    [comment setEditable:NO]; 
    [comment setText:commentText]; 
    [self addSubview:comment]; 
    CGRect curentFrame = comment.frame; 
    curentFrame.size.height = comment.contentSize.height; 
    curentFrame.origin.x = toggle.frame.size.width + toggle.frame.origin.x + 10; 
    curentFrame.size.width = self.frame.size.width - curentFrame.origin.x; 
    curentFrame.origin.y = toggle.frame.size.height + toggle.frame.origin.y + 10; 
    [comment setFrame:curentFrame]; 

    curentFrame = self.frame; 
    curentFrame.size.height += comment.frame.size.height + 10; 
    [self setFrame:curentFrame]; 
    float height = comment.frame.origin.y + comment.frame.size.height; 
    for (NSObject* o in subComments) 
    { 
     CommentView* subComment = [[CommentView alloc] initWithFrame:CGRectMake(comment.frame.origin.x,height,0,self.frame.size.width)]; 
     [self addSubview:subComment]; 
     height += subComment.frame.size.height; 
     curentFrame = self.frame; 
     curentFrame.size.height += subComment.frame.size.height; 
     [self setFrame:curentFrame]; 
     [self bringSubviewToFront:subComment]; 
    } 
    expanded = YES; 
} 

- (void) collapse 
{ 
    for (UIView* v in [self subviews]) 
    { 
     [v removeFromSuperview]; 
    } 

    CGRect curentFrame = self.frame; 
    curentFrame.size.height = toggle.frame.size.height + 10; 
    [self setFrame:curentFrame]; 

    curentFrame = toggle.frame; 
    curentFrame.origin.y = 5; 
    curentFrame.origin.x = 5; 
    [toggle setFrame:curentFrame]; 
    [self addSubview:toggle]; 

    expanded = NO; 

} 

/* 
// Only override drawRect: if you perform custom drawing. 
// An empty implementation adversely affects performance during animation. 
- (void)drawRect:(CGRect)rect 
{ 
    // Drawing code 
} 
*/ 

@end 

ViewContoller.m(使用例)

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    CommentView* mainCommentView = [[CommentView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)]; 

    Comment* mainComment = [[Comment alloc] init]; 
    [mainComment setComment: @"Lorem Ipsum 1"]; 

    Comment* sub1 = [[Comment alloc] init]; 
    [sub1 setComment: @"Lorem Ipsum 1-1"]; 
    Comment* sub11 = [[Comment alloc] init]; 
    [sub11 setComment: @"Lorem Ipsum 1-1-1"]; 
    [[sub1 subComments] addObject:sub11]; 

    Comment* sub2 = [[Comment alloc] init]; 
    [sub2 setComment: @"Lorem Ipsum 1-2"]; 
    Comment* sub12 = [[Comment alloc] init]; 
    [sub12 setComment: @"Lorem Ipsum 1-2-1"]; 
    [[sub2 subComments] addObject:sub12]; 

    [[mainComment subComments] addObject:sub1]; 
    [[mainComment subComments] addObject:sub2]; 

    [mainCommentView setCommentText:[mainComment comment]]; 
    [mainCommentView setSubComments:[mainComment subComments]]; 

    self.view = mainCommentView; 
} 
+0

ワウ、おかげマット。これは素晴らしい。私はサンプルプロジェクトでこのすべてを投げたときに、最初の主なコメントだけが表示されていることに気付きました。サブコメントのインジケータをクリックしても何も行われません。どんな考え? – barfoon

+0

'expand'メソッドは子コメントのために決して起動されません、私はそれがビューのフレーミングと関係があると考えます – barfoon

-1

もあります。このようなものではないコメントを表示するカスタム構築されたHTMLページを持つだけWebViewのですか?

関連する問題