【问题标题】:Why is [UITableView appearance] messing up a UIDatePicker?为什么 [UITableView 外观] 弄乱了 UIDatePicker?
【发布时间】:2014-02-18 10:39:17
【问题描述】:

在将 UIDatepicker 呈现为 UITextField 子类的 inputView 时,我遇到了一个奇怪的问题。 发生的情况是选择器正在显示,但第二列被某些东西截断,导致月份名称在第三个或第四个字符处被截断。这是这个问题的screenshot

整个问题是在应用程序开始时产生的,同时设置了一些样式,特别是 UITableView 样式。造成这种行为的代码行是这样的:

[[UITableView appearance] setBackgroundColor:[self greyPayAppColor]];

greyPayAppColor 只是在别处定义的一些自定义灰色。事实上,这就是涵盖月份名称的屏幕截图中显示的确切颜色。 现在,我真的很困惑,因为我不知道 UITableView 外观消息如何弄乱 UIDatePicker。另一件事是,这个问题只发生在用作文本字段的 inputView 的 UIDatePicker 上,而不是由 IB 生成的常规。

出于复制目的,我正在使用我的 UITexField 子类。它生成两个视图,一个 UIDatePicker 和一个 UIToolbar,将它们设置为文本字段 inputView 和 inputAccessoryView。当按下“完成”和“取消”按钮时,它还使用委托进行通信。

.h 文件:

#import <UIKit/UIKit.h>

@protocol DatePickerTextFieldDelegate <NSObject>

@optional
- (void)didDismissDatePickerWithDate:(NSDate *)date; // If date == nil => cancel was pressed
@end

@interface DatePickerTextField : UITextField
@property (nonatomic, weak) id<DatePickerTextFieldDelegate> datePickerDelegate;
@property (nonatomic, strong) NSDate *date;


@end

.m 文件:

#import "DatePickerTextField.h"

@interface DatePickerTextField ()
@property (strong, nonatomic) UIToolbar *toolBar;
@property (strong, nonatomic) UIDatePicker *datePicker;
@end

@implementation DatePickerTextField

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

- (void)awakeFromNib
{
    [self setup];
}

- (void)setup
{
    self.datePicker = [self setupDatePicker];
    self.toolBar = [self setupToolBar];
    self.inputView = self.datePicker;
    self.inputAccessoryView = self.toolBar;
}

- (UIDatePicker *)setupDatePicker
{
    UIDatePicker *datePicker = [[UIDatePicker alloc] init];
    datePicker.datePickerMode = UIDatePickerModeDate;
    return datePicker;
}

- (void)setDate:(NSDate *)date
{
    _date = date;
    if (_date) {
        self.text = [self localizedDateString:_date];
        [self.datePicker setDate:_date animated:NO];
    }
}

- (NSString *)localizedDateString:(NSDate *)date
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
    [dateFormatter setTimeStyle:NSDateFormatterNoStyle];
    NSString *dateString = [dateFormatter stringFromDate:date];
    return dateString;
}

- (UIToolbar *)setupToolBar
{
    CGFloat width = [self superview].frame.size.width;
    UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, width, 44)];
    UIBarButtonItem *extraSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    UIBarButtonItem *cancel = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelPressed)];
    UIBarButtonItem *done = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(donePressed)];
    toolBar.items = @[cancel,extraSpace,done];
    return toolBar;
}

- (void)cancelPressed
{
    [self.datePickerDelegate didDismissDatePickerWithDate:nil];
}

- (void)donePressed
{
    [self.datePickerDelegate didDismissDatePickerWithDate:self.datePicker.date];
}

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

@end

【问题讨论】:

    标签: ios objective-c cocoa-touch uitableview uidatepicker


    【解决方案1】:

    我一直不明白为什么会发生这种情况,但我设法通过覆盖该特定 VC 中的外观调用来解决它,因为它不包含 tableView,如下所示:

    // override appearence
    [[UITableView appearanceWhenContainedIn:[self.superview class], nil] setBackgroundColor:[UIColor clearColor]];
    

    我还是想了解一下 UITableView 和 UIDatepicker 之间的这种关系。有知道的请留言!

    谢谢。

    【讨论】:

      猜你喜欢
      • 2011-01-31
      • 1970-01-01
      • 2010-09-30
      • 2013-04-05
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 2019-06-11
      • 1970-01-01
      相关资源
      最近更新 更多