Change the font and its picker size in quick

With Objective-C, I used the code below to set / change the font family and collector size:

- (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; } 

However, Swift does not accept stock from UIView to UILabel, and therefore I cannot follow this path, which will look something like the following:

 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 } 

The first stament (let label ....) raises an exception at runtime:

EXC-BAD INSTRUCTION (code = EXC_I386_INVOP, subcode = 0x0)

+5
source share
5 answers

More idiomatic Swift coding would be:

 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 } 
+1
source

For 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 } 
+18
source

To change the name and font size, you can use viewForRow and the attribute string:

 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 } 

And if you make the font size larger, you'll want to increase the height of each row with rowHeightForComponent:

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

If you want the select label to be AUTOSHRINK ...

Set adjustsFontSizeToFitWidth=true and 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 } 
+4
source

For quick 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 } 

For 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! } 
+2
source

Source: https://habr.com/ru/post/1235715/


All Articles