2012-06-21 54 views
3

我在我的UIscrollView有问题,这是我所做的:每当用户在相机中通过Imagepicker选择一个图像(多个或单个)时,我想在我的UIScrollView中显示它。我能够显示它,但是当我再次访问Imagepicker时,再次选择一张图像,它不更新UIScrollView,我试图将我的[self createScrollView]放在我的viewDidAppear中,但它重新创建了UIScrollView但未更新它,因此旧图像和新图像组合在一起。所以我已经把它们放在viewDidLoad中,但是只有当我再次转到另一个View Controller时它才会更新。UIScrollView没有更新和正确显示

//我UIScrollView与缩略图

- (void) createScrollView { 
    self.slotBg = [[UIView alloc] initWithFrame:CGRectMake(43, 370, 300, 143)]; 
    CAGradientLayer *gradient = [CAGradientLayer layer]; 
    gradient.frame = self.slotBg.bounds; 
    gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor grayColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil]; 
    [self.slotBg.layer insertSublayer:gradient atIndex:0]; 
    [self.view addSubview:self.slotBg]; 

    self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0.0f,0.0f,300.0f,134.0f)]; 
    [slotBg addSubview:self.scrollView]; 


    int row = 0; 
    int column = 0; 
    for(int i = 0; i < _thumbs.count; ++i) { 

     UIImage *thumb = [_thumbs objectAtIndex:i]; 
     UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom]; 
     button.frame = CGRectMake(column*60+10, row*60+10, 60, 60); 
     [button setImage:thumb forState:UIControlStateNormal]; 
     [button addTarget:self 
        action:@selector(buttonClicked:) 
     forControlEvents:UIControlEventTouchUpInside]; 
     button.tag = i; 

     [scrollView addSubview:button]; 

     if (column == 4) { 
      column = 0; 
      row++; 
     } else { 
      column++; 
     } 

    } 

    [scrollView setContentSize:CGSizeMake(330, (row+1) * 60 + 10)]; 
} 

//在我viewDidLoad中

- (void)viewDidLoad 
{ 
     for(int i = 0; i <= 100; i++) 
     { 
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
      NSString *documentsDir = [paths objectAtIndex:0]; 

      NSString *savedImagePath = [documentsDir stringByAppendingPathComponent:[NSString stringWithFormat:@"oneSlotImages%d.png", i]]; 
      NSLog(@"savedImagePath=%@",savedImagePath); 
      if([[NSFileManager defaultManager] fileExistsAtPath:savedImagePath]){ 
       [self addImage:[UIImage imageWithContentsOfFile:savedImagePath]]; 

       NSLog(@"file exists"); 
      } 
     } 
     NSLog(@"Count : %d", [_images count]); 
     [self createScrollView]; 
} 

编辑:

- (void) viewDidLoad { 
    [self createScrollView]; 

    [_thumbs removeAllObjects]; 
    UIView *removeView; 
    for(int i = 0; i < _thumbs.count; ++i) { 
    while((removeView = [scrollView viewWithTag:i]) != nil) { 
     [removeView removeFromSuperview]; 
    } 

     { 
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
      NSString *documentsDir = [paths objectAtIndex:0]; 

      NSString *savedImagePath = [documentsDir stringByAppendingPathComponent:[NSString stringWithFormat:@"oneSlotImages%d.png", i]]; 
      NSLog(@"savedImagePath=%@",savedImagePath); 
      if([[NSFileManager defaultManager] fileExistsAtPath:savedImagePath]){ 
       [self addImage:[UIImage imageWithContentsOfFile:savedImagePath]]; 
       NSLog(@"file exists"); 
      } 
     } 
     NSLog(@"Count : %d", [_images count]); 
    } 
} 
+0

查看视图控制器的'[self setNeedsDisplay];'方法。它告诉设备“重新绘制视图,它已被更新。” – Kyle

回答

1

有两点:

  1. 检查您的数据源。如果图像已被正确保存在文档目录中或没有。
  2. 不需要再次创建滚动视图及其父视图。将代码从createScrollView移至viewDidLoad。这些视图应该只创建一次。

self.slotBg = [[UIView alloc] initWithFrame:CGRectMake(43,370,300,143)]; CAGradientLayer * gradient = [CAGradientLayer图层]; gradient.frame = self.slotBg.bounds; gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor grayColor] CGColor],(id)[[UIColor whiteColor] CGColor],nil]; [self.slotBg.layer insertSublayer:gradient atIndex:0]; [self.view addSubview:self.slotBg];

self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0.0f,0.0f,300.0f,134.0f)]; 
[slotBg addSubview:self.scrollView]; 

现在,从viewDidAppear,首先更新_thumbs数组(数据源)。然后调用createScrollView函数。在这个函数里面,首先使用UIScrollView中的标签去掉所有的子视图。像你所做的那样再次添加所有的拇指。然后在从createScrollView返回之前调用[self setNeedsDisplay]。

+0

如何更新'_thumbs数组(数据源)',我试过'_thumbs reloadData];'但不工作。以及如何从UIScrollView中使用标记删除所有子视图。再次添加所有的拇指? – Bazinga

+0

[_thumbs removeAllObjects];使其成为空白,然后将对象添加到它中。要移除scrool视图的视图,请[[scrollView viewWithTag:i] removeFromSuperView];在这里,我应该迭代0 _thumbs.count。 – Apurv

+0

你有没有检查过,你的_thumbs数组有多一个成员? – Apurv