【问题标题】:Is it possible to provide a UIView to a UIPickerView that 'fills' the row?是否可以向“填充”行的 UIPickerView 提供 UIView?
【发布时间】:2011-03-04 07:54:03
【问题描述】:

我正在尝试为 UIPickerView 提供自定义视图,以便每一行的整个背景都是两种颜色之一(都不是白色)。

我已经能够提供这些自定义视图,可以使用我想要的颜色,但我不能让视图填充行的整个“空间”。

下面的测试代码试图实现将 UIPicker 的背景颜色更改为绿色的效果 - 但我提供的视图没有正确对齐。它总是向左几个像素,有时实际上覆盖组件的左边缘,具体取决于其宽度。

这样做的效果是我总是在右侧看到一个白边。

更改 CGRect 的原点不会更改其在行中的位置。

改变 CGRect 的宽度可以改变宽度,但它仍然总是向左对齐几个像素。即不居中。

谁能告诉我我在这里做错了什么?

我只是将一个标准的 UIPicker 放到一个视图上。

- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component {
   return 44;
}

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component {
   return 200;
}

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
   UIView *rowView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 44)] autorelease];
   rowView.backgroundColor = [UIColor greenColor];
   return rowView;  
}

【问题讨论】:

    标签: iphone uipickerview


    【解决方案1】:

    好的,我已经设法至少将视图“居中”了。

    我必须向从 viewForRow 返回的视图添加一个子视图,并为 origin.x 值尝试一些值,如下所示:

    - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
    
        UIView *rowView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 44)] autorelease];
    
        UIView *subView = [[[UIView alloc] initWithFrame:CGRectMake(6, 0, 194, 44)] autorelease];
        subView.backgroundColor = [UIColor greenColor];
        [rowView addSubview:subView];
    
        return rowView;
    }
    

    由于某种原因,尽管我无法让视图扩展到行的最边缘,因此出现在视图两侧的白色边缘仍然存在。我可以忍受这个。

    希望这对其他人有所帮助。

    【讨论】:

      【解决方案2】:
      - (UIView *)pickerView:(UIPickerView *)apickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
      
          UIView *rowView = nil;
      
          if(view==nil) {
              rowView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)] autorelease];
              rowView.backgroundColor = [UIColor greenColor];
              return rowView;
          }
      
      
          return view;  
      }
      

      “诀窍”在于返回重用视图(如果可用)。 在此之后,您可以根据需要配置视图。

      “320”值只是为了测试,您应该输入一些计算值,例如 pickerView.frame.size.width,这样代码会更简洁。

      【讨论】:

      • 感谢您的回复弗洛里安。我同意我没有正确重用视图。我认为我看到的问题(无法使视图居中并扩展它以删除白色边缘)是因为返回的最顶部视图的原点无法更改,并且宽度似乎没有效果超过一定值。将此设置为 320 或任何大于 widthForComponent 中返回的值对我没有影响。我已经更新了帖子(以删除视图“重用”检查)以反映这一点,并据我所知将重点放在需要子视图的视图上。
      猜你喜欢
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多