Размер кадра UIPickerView - проблема с полем - PullRequest
1 голос
/ 30 декабря 2010

Кажется, я нигде не могу найти ответ на этот вопрос - надеясь, что кто-то может помочь! Кто-нибудь знает, как определить поля, которые iOS накладывает на средство выбора?

Я написал общее представление, которое отображает UIPickerView с количеством цифр и меток в соответствующих позициях. UIPickerView был создан в конструкторе интерфейсов и заполняет весь экран. В настоящее время я использую свойство frame для UIPickerView, чтобы определить ширину средства выбора и вычислить ширину отдельных компонентов и положения меток.

обновлен Как и просили - я пытался включить код. Я создаю универсальный UIViewController, в котором есть один инструмент выбора в связанном файле .xib - я загружаю его как модальное представление всякий раз, когда мне нужно ввести любое числовое значение, просто задав ему необходимые параметры. Средство выбора интерфейса в Интерфейсном Разработчике установлено в режим «По центру» - я пробовал несколько других, но на самом деле ничто не имеет никакого значения для макета.

Класс принимает количество цифр и количество знаков после запятой, а также описание единицы измерения. Число компонентов затем определяется этими значениями, и две метки размещаются соответствующим образом над компонентами выбора, чтобы показать десятичную точку и метку единицы измерения. Метод viewDidLoad показан ниже. Он генерирует стандартную ширину компонента, которая используется в методах делегата UIPickerView. Математика, кажется, все в порядке, но позиционирование идет неправильно, и я думаю, что это из-за поля вокруг края сборщика.

unitLabel.text = [NSString stringWithFormat:@"%@", unitDescription];
CGSize labelSize = [[unitLabel text] sizeWithFont:[unitLabel font]];
labelWidth = labelSize.width;

decimalPoint.text = [NSString stringWithFormat:@"."];
CGSize pointSize = [[decimalPoint text] sizeWithFont:[decimalPoint font]];
dpWidth = pointSize.width;
if (decimalPlaces == 0) {
    // Hide the decimal point
    decimalPoint.hidden = YES;
    dpWidth = 0;
}
else {
    decimalPoint.hidden = NO;
}

CGFloat pickerWidth = picker.frame.size.width;
//Now determine the standard component width
componentWidth = (pickerWidth - labelWidth - dpWidth) / (digits + decimalPlaces);   

//Now position the decimal point and label
//The components will be centred on the screen, so the location for the labels will be:
//Decimal point:
//Left position of picker + (componentWidth * digits)
//Unit:
//Left position of picker + (componentWidth * digits) + dpWidth + (componentWidth * decimalPlaces)
//Where:
//Left position of picker = screen width  -  (componentWidth * digits) + dpWidth + (componentWidth * decimalPlaces) + labelWidth
//                          ------------     -----------------------------------------------------------------------------------
//                                2                                 2
//
CGFloat leftPos = (picker.frame.size.width / 2) - (((componentWidth * digits) + dpWidth + (componentWidth * decimalPlaces) + labelWidth) / 2);
CGFloat dpPos = leftPos + (componentWidth * digits);
CGFloat labelPos = leftPos + (componentWidth * digits) + dpWidth + (componentWidth * decimalPlaces);

CGRect dpFrame = decimalPoint.frame;
dpFrame.origin.x = dpPos;
dpFrame.origin.y = picker.center.y - (5 * (pointSize.height / 12));
decimalPoint.frame = dpFrame;

CGRect labelFrame = unitLabel.frame;
labelFrame.origin.x = labelPos;
labelFrame.origin.y = picker.center.y - (5 * (labelSize.height / 12));
unitLabel.frame = labelFrame;
...