UIPageControl错误:首先显示一个项目符号,然后显示所有内容

时间:2010-04-10 17:24:02

标签: iphone sdk uiscrollview

我使用UIPageControl有一些奇怪的行为:

首先它只显示一个子弹,然后当我移动滚动视图时,所有子弹都正确显示。在我将其添加为子视图之前,是否有一些我遗漏的东西?

这是我的代码imageScrollView.h:

@interface ImageScrollView : UIView <UIScrollViewDelegate> {
  NSMutableDictionary *photos;
  BOOL *pageControlIsChangingPage;
  UIPageControl *pageControl;
}
@property (nonatomic, copy) NSMutableDictionary *photos; 
@property (nonatomic, copy) UIPageControl *pageControl; 
@end

以下是imageScrollView.m的代码:

#import "ImageScrollView.h"


@implementation ImageScrollView
@synthesize photos, pageControl;

- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
    // Initialization code
    }
    return self;
}

- (void) drawRect:(CGRect)rect
{
  [self removeAllSubviews];

  UIScrollView *scroller = [[UIScrollView alloc]      initWithFrame:CGRectMake(0,0,self.frame.size.width,self.frame.size.height)];
  [scroller setDelegate:self];

  [scroller setBackgroundColor:[UIColor grayColor]];

  [scroller setShowsHorizontalScrollIndicator:NO];
  [scroller setPagingEnabled:YES];

  NSUInteger nimages = 0;
  CGFloat cx= 0;

  for (NSDictionary *myDictionaryObject in photos)
  {
    if (![myDictionaryObject isKindOfClass:[NSNull class]]) {
    NSString *photo =[NSString stringWithFormat:@"http://www.techbase.com.mx/blog/%@",[myDictionaryObject objectForKey:@"filepath"]];
    NSDictionary *data = [myDictionaryObject objectForKey:@"data"];

    UIView *imageContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height - 30)];

    TTImageView *imageView = [[TTImageView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height - 30)];
    imageView.urlPath=photo;
    [imageContainer addSubview:imageView];

    UILabel *caption = [[UILabel alloc] initWithFrame:CGRectMake(0,imageView.frame.size.height,imageView.frame.size.width,10)];

    [caption setText:[NSString stringWithFormat:@"%@",[data objectForKey:@"description"]]];
    [caption setBackgroundColor:[UIColor grayColor]];
    [caption setTextColor:[UIColor whiteColor]];
    [caption setLineBreakMode:UILineBreakModeWordWrap];
    [caption setNumberOfLines:0];
    [caption sizeToFit];
    [caption setFont:[UIFont fontWithName:@"Georgia" size:10.0]];
    [imageContainer addSubview:caption];

    CGRect rect = imageContainer.frame;
    rect.size.height = imageContainer.size.height;
    rect.size.width = imageContainer.size.width;
    rect.origin.x = ((scroller.frame.size.width - scroller.size.width) / 2) + cx;
    rect.origin.y = ((scroller.frame.size.height - scroller.size.height) / 2);
    imageContainer.frame=rect;
    [scroller addSubview:imageContainer];
    [imageView release];
    [imageContainer release];
    [caption release];

    nimages++;
    cx +=scroller.frame.size.width;

    }

  }

  [scroller setContentSize:CGSizeMake(nimages * self.frame.size.width, self.frame.size.height)];
  [self addSubview:scroller];
  pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(self.frame.size.width/2,  self.frame.size.height -20, (self.frame.size.width/nimages)/2, 20)];
  pageControl.numberOfPages=nimages;
  [self addSubview:pageControl];

  [scroller release];

  }

  -(void)dealloc {
    [pageControl release];
    [super dealloc];
  }


   -(void)scrollViewDidScroll:(UIScrollView *)_scrollView{
     if(pageControlIsChangingPage){
     return;
   }
   CGFloat pageWidth = _scrollView.frame.size.width;
   int page = floor((_scrollView.contentOffset.x - pageWidth /2) / pageWidth) + 1;
   pageControl.currentPage = page; 
   }

  -(void)scrollViewDidEndDecelerating:(UIScrollView *)_scrollView{
 pageControlIsChangingPage  = NO;
}

@end

1 个答案:

答案 0 :(得分:1)

由于您在UIPageControl方法中绘制drawRect,因此在初始化之后需要调用此控件的setNeedsLayout方法。否则,在强制进行重绘的事件被调用之前,它将无法正确呈现。

pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(self.frame.size.width/2,  self.frame.size.height -20, (self.frame.size.width/nimages)/2, 20)];
pageControl.numberOfPages=nimages;
[pageControl setNeedsLayout];
[self addSubview:pageControl];