2014-10-06 4 views
10

Я хотел бы установить цвет границы с помощью раскадровки, если возможно. Я видел ответ здесь: UITextField border colorUITextField установить цвет границы с помощью раскадровки

И я последовал ответ в раскадровке: enter image description here

Все свойства, установленные, но TextField не показывает границу. Какие-либо предложения?

+0

Вы можете увидеть [Как добавить границу в раскадровку] (http://stackoverflow.com/questions/12301256/is-it-possible-to-set-uiview-border-properties-from-interface-builder/ 30348021 # 30348021) – iHulk

ответ

2

Я не уверен, что вы можете изменить цвет границы поля UIText в раскадровке. Вы можете программно изменить его с помощью чего-то;

UITextField *myTextField = (UITextField *)[self.view viewWithTag:1]; 
myTextField.borderStyle = UITextBorderStyleLine; 
myTextField.layer.borderWidth = 2; 
myTextField.layer.borderColor = [[UIColor redColor] CGColor]; 

Надеюсь, это поможет.

+0

@katit - это какая-то помощь, или вы нашли способ сделать это в раскадровке? – Gismay

0

Он не показывает никаких границ из-за свойства layer.borderColor. Это атрибуты типа CGColor и Runtime пока не поддерживают это по умолчанию, поэтому, устанавливая только один атрибут неправильно, отключает и другие.

Чтобы сделать это из раскадровки, но и с участием код и подклассов, вы можете использовать этот метод:

Подкласс UITextField и сделать IB_DESIGNABLE UIColor свойством, что вы затем преобразовать в CGColor и применить его до self.layer.borderColor.

7

Как отметил Богдан, вы не можете найти свойство layer.borderColor в раскадровке, поскольку это время выполнения.

Однако вы можете установить borderColor без использования IB_DESIGNABLE в любом представлении (или подклассе UIView) с небольшим количеством кодировок.

Ниже приведены шаги, как достигнуть этого,

  1. Создать категорию на классе CALayer. Объявите свойство типа UIColor с подходящим названием, я назову его borderUIColor.
  2. Запишите установщик и геттер для этого свойства.
  3. В методе 'Setter' просто установите свойство borderColor слоя для нового значения цвета CGColor.
  4. В методе «Getter» возвратите UIColor с помощью borderColor слоя.

P.S: Помните, что категории не могут быть сохранены. «borderUIColor» используется как вычисленное свойство, как ссылка для достижения того, на что мы фокусируемся.

Пожалуйста, взгляните на образец кода ниже;

Objective C:

файла Интерфейс: Файл

#import <QuartzCore/QuartzCore.h> 
#import <UIKit/UIKit.h> 

@interface CALayer (BorderProperties) 

// This assigns a CGColor to borderColor. 
@property (nonatomic, assign) UIColor* borderUIColor; 

@end 

Реализация:

#import "CALayer+BorderProperties.h" 

@implementation CALayer (BorderProperties) 

- (void)setBorderUIColor:(UIColor *)color { 
    self.borderColor = color.CGColor; 
} 

- (UIColor *)borderUIColor { 
    return [UIColor colorWithCGColor:self.borderColor]; 
} 

@end 

Swift 3,1:

extension CALayer { 
    var borderUIColor: UIColor { 
     set { 
      self.borderColor = newValue.cgColor 
     } 

     get { 
      return UIColor(cgColor: self.borderColor!) 
     } 
    } 
} 

И, наконец, перейдите на свою раскадровку/XIB, следуйте оставшимся этапам;

  1. Нажмите на объект «Вид», для которого вы хотите установить границу цвета.
  2. Нажмите «Идентификационный инспектор» (третий слева) на панели «Утилита» (правая сторона экрана).
  3. В разделе «Пользовательские атрибуты времени выполнения» нажмите кнопку «+», чтобы добавить путь к ключу.
  4. Задайте тип пути для ключа «Цвет».
  5. Введите значение для ключевого пути как «layer.borderUIColor». [Помните, что это должно быть имя переменной, которое вы объявили в категории, а не borderColor здесь borderUIColor].
  6. Наконец-то выбрали нужный цвет.

Edit: Вы установить значение layer.borderWidth свойства, по меньшей мере, 1, чтобы увидеть цвет границы.

Строительство и запуск. Счастливое кодирование. :)

+0

Для ** Swift 3 ** вам просто нужно заменить все экземпляры 'CGColor'' cgColor' в ** Swift 2 **. – CAD97

0

Это вариант ответа @rameswar, который я считаю правильным. Поскольку мы применяем в UIColor, я думаю, что предпочтительнее, чтобы написать расширение для UITextField вместо (UI вещей вместе):

extension UITextField { 

    var borderColor : UIColor? { 
    get { 
     if let cgcolor = layer.borderColor { 
     return UIColor(CGColor: cgcolor) 
     } else { 
     return nil 
     } 
    } 
    set { 
     layer.borderColor = newValue?.CGColor 

     // width must be at least 1.0 
     if layer.borderWidth < 1.0 { 
     layer.borderWidth = 1.0 
     } 
    } 
    } 
} 

Свойство выполнения будет затем borderColor (так что вам не нужно вводить layer. и я думаю, что это немного чище, чем borderUIColor).

borderColorCALayer не является обязательным, так что это свойство. Он становится черным, когда установлено значение nil

И, наконец, layer.borderWidth установлено минимальное значение 1.0, потому что цвет не установлен иначе.

3

Ну, как указано в Bogdan, вы можете очень хорошо сделать это с простым подклассом и всего несколькими битами кода. После этого все будет доступно для редактирования в Раскадровки.

  1. Подкласс UITextField
  2. Создайте два свойства, один для ширины границы и один для цвет границы
  3. сделать эти переменные IBInspectable и весь класс IBDesignable
  4. Вы сможете изменить цвет и ширину границы и увидеть изменения в реальном времени.

Код для иллюстрации (Swift 3.1):

@IBDesignable 
class FormTextField: UITextField { 

    @IBInspectable var borderColor: UIColor? { 
     didSet { 
      layer.borderColor = borderColor?.cgColor 
     } 
    } 

    @IBInspectable var borderWidth: CGFloat = 0 { 
     didSet { 
      layer.borderWidth = borderWidth 
     } 
    } 
} 

Edit: Вы увидите, что это в ваших Атрибуты Инспектор

Attributes Inspector

Смежные вопросы