2015-11-11 19 views
5

z Objective-C, użyłem poniższy kod, aby ustawić/zmienić rodzinę czcionek i rozmiaru próbnika:zmianę czcionki i jej wielkość próbnika w szybkim

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view { 
UILabel* tView = (UILabel*)view; 
if (!tView){ 
    tView = [[UILabel alloc] init]; 
    // Setup label properties - frame, font, colors etc 
    tView.font = [UIFont fontWithName:@"Times New Roman" size:fontsize];; 
} 
tView.text = [_mysitedata findKeyForRow:row]; 
NSLog(@"C key:%@ row:%ld comp:%ld", tView.text, (long int)row, (long int)component); 
return tView; 
} 

Jednak Swift nie akceptuje odlew z UIView do UILabel i dlatego nie mogę podążać tą ścieżką, która będzie wyglądał jak pokazano poniżej:

func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView { 
    let label = view as! UILabel 
    label.font = UIFont(name: "Times New Roman", size: 1.0) 
    label.text = pickerData[row] 
    return label 
} 

pierwszy stament (niech etykietę ....) throuws wyjątek w czasie wykonywania:

EXC-BAD INSTRUKCJA (code = EXC_I386_INVOP, subkod = 0x0)

+0

Ten link [link] http://stackoverflow.com/questions/27455345/uipickerview-wont-allow-changing-font- name-and-size-through-delegates-attributedt [> link] rozwiązuje problem. –

Odpowiedz

1

Bardziej idiomatyczne Swift kodowanie byłoby:

func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView { 
    guard let label = view as? UILabel else { 
    preconditionFailure ("Expected a Label") 
    } 

    label.font = UIFont(name: "Times New Roman", size: 1.0) 
    label.text = pickerData[row] 
    return label 
} 
+0

Dla tych z was, którzy mnie lubili, którzy popełniali błąd podczas próby tego podejścia, i spędzili zbyt wiele czasu, próbując dowiedzieć się, co jest nie tak, alternatywne podejście, które działa, jest tutaj: http://stackoverflow.com/questions/27455345/ uipickerview-wont-allow-change-font-name-and-size-via-delegates-attributedt – Ben

5

Aby zmienić nazwę i rozmiar czcionki można użyć viewForRow i przypisać ciąg:

func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView { 

    var label = view as! UILabel! 
    if label == nil { 
     label = UILabel() 
    } 

    var data = pickerData[row] 
    let title = NSAttributedString(string: data!, attributes: [NSFontAttributeName: UIFont.systemFontOfSize(36.0, weight: UIFontWeightRegular)]) 
    label.attributedText = title 
    label.textAlignment = .Center 
    return label 

} 

A jeśli twój rozmiar czcionki większe będziemy chcieli, aby zwiększyć wysokość każdego wiersza z rowHeightForComponent:

func pickerView(pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { 
    return 36.0 
} 
+0

Możesz również zamienić kilka pierwszych wierszy na: let label = (zobacz jako? UILabel)? UILabel() – RowanPD

18

Dla Swift 3

func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView { 
    let label = (view as? UILabel) ?? UILabel() 

    label.textColor = .black 
    label.textAlignment = .center 
    label.font = UIFont(name: "SanFranciscoText-Light", size: 18) 

    // where data is an Array of String 
    label.text = pickerData[row] 

    return label 
    } 
2

Swift 2.3

func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView{ 

     var label = view as! UILabel! 
     if label == nil { 
      label = UILabel() 
     } 

     label.font = UIFont(name: "Lato-Regular", size: 17)! 
     label.text = dataArray[row] as? String 
     label.textAlignment = .Center 
     return label 

    } 

Dla Swift 3

func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView{ 

     print("Returning Custom label") 
     var label = view as! UILabel! 
     if label == nil { 
      label = UILabel() 
     } 

     label?.font = UIFont(name: "Lato-Regular", size: 14)! 
     label?.text = dataArray[row] as? String 
     label?.textAlignment = .center 
     return label! 

    } 
4

Jeśli chcesz t on etykieta zbieracz do autoshrink ...

Set adjustsFontSizeToFitWidth=true i minimumScaleFactor=0.5

func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView { 

    var label: UILabel 
    if let view = view as? UILabel { label = view } 
    else { label = UILabel() } 

    label.text = "..." 
    label.textAlignment = .center 
    label.font = UIFont.boldSystemFont(ofSize: 20) 
    label.adjustsFontSizeToFitWidth = true 
    label.minimumScaleFactor = 0.5 

    return label 
} 
Powiązane problemy