UiPickerView具有自定义固定标签和自动布局

Luc*_*uca 13 cocoa uipickerview

我需要实现一个UIPickerView选择小时,分钟和秒.我需要在拾取器旋转时保持固定的每个组件旁边都有一个标签.例如,您可以查看Apple Clock应用程序的计时器部分.我把图像作为参考

在此输入图像描述

当然我需要一个带有3个组件的选择器,但问题是一样的.我找到了很多解决方案,将标签添加为子视图,并使用一些框架和手动调整来定位,但是无法使其与AutoLayout一起使用,而且我在网络上找不到解决方案.有人解决了这个问题吗?谢谢

trd*_*son 1

我在我开发的应用程序中遇到了类似的问题,并决定采取以下措施:

我。创建 UIPicker

二. 找到所显示的选取器行的中点。

三. 将两个 UILabels 添加到屏幕和 in -(void)layoutSubview;确保标签始终位于中点旁边。

我的项目中只需要纵向模式支持,但对于横向模式也应该可以正常工作。只需选择足够宽的行宽,这样您就不会与选择器内的数据有任何重叠。这是 UIPicker 的代码片段:

#pragma mark - Picker View

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 2;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    if(component == 0) {
        return self.hourPickerData.count;
    } else {
        return self.minutePickerData.count;
    }
}

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

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

-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
    NSString *text;

    if(component == 0) {
        text = self.hourPickerData[row];
    } else {
        text = self.minutePickerData[row];
    }

    UILabel *label = (UILabel*)view;
    if(view == nil) {
        label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 40, 30)];
        label.backgroundColor = [UIColor clearColor];
        label.text = text;
        label.textAlignment = NSTextAlignmentCenter;
        label.textColor = LYTiT_HEADER_COLOR;
        label.font = [UIFont fontWithName:LT_HELVETICA size:16];
    }

    return label;
} 
Run Code Online (Sandbox Code Playgroud)

  • 我不明白你提出的解决方案。 (3认同)
  • 来自 Apple 文档:layoutSubviews - 如果您需要比约束或自动调整大小行为提供的更精确的子视图布局控制,请实现此方法。在自动布局发生后调用此方法,以便您可以一起使用它们。基本思想是,您提前知道拾取器的高度,因此您知道拾取器的中点。由于您还知道每个组件的宽度(您自己在委托方法中指定),因此您知道将标签放置在哪里以使它们准确地出现在正确的位置。 (3认同)