Чи можна встановити властивості кордону UIView від конструктора інтерфейсів?


184

Чи можна керувати властивостями меж UIView (кольором, товщиною тощо) безпосередньо від побудовника інтерфейсу або я можу це робити лише програмно?



1
Про всяк випадок, якщо хтось із Google приїде так, як я. Щоб побачити, що ці зміни відображаються в ІБ, вам просто потрібно створити підклас UIView і призначити його будь-якому виду, яким ви хочете маніпулювати в ІБ.
Канонгата

Відповіді:


392

Насправді ви можете встановити деякі властивості шару подання через конструктор інтерфейсів. Я знаю, що через xcode я можу встановити рамку шару borderWidth та cornerRadius. borderColor не працює, ймовірно, тому, що шар хоче CGColor замість UIColor.

Можливо, вам доведеться використовувати рядки замість чисел, але це працює!

layer.cornerRadius
layer.borderWidth
layer.borderColor

Оновлення: layer.masksToBounds = true

приклад

Оновлення: виберіть відповідний тип для Keypath:

введіть тут опис зображення


3
Вам і Пітеру ДеВізе: Я використовую Xcode 4.6.3 і можу встановити тип клавіатури на "Кольоровий", не застосовуючи інтерфейс

39
На жаль, layer.borderColor не можна встановити таким чином. Це CGColorRef, але цей тип значення IB Color - це UIColor.
mrgrieves

12
Отже, це те, що визначені користувачем атрибути виконання! Ха-ха, писав для iOS з 2011 року, і я ніколи не дізнався, для чого ці поля. Дякую за цю дивовижну відповідь.
Енді Ібанез

3
Приємно, але ви повинні встановити правильний тип для кожного ресурсу. Тип для, наприклад, "layer.cornerRadius" повинен бути встановлений на "Number" замість "String"!
Пітер Крейнц

5
Крім того, не забудьте встановити прапорець "Кліп до меж", щоб угол Радіус працював.
П'єр-Олів'є Сімонард

183

Відповідь Rich86Man правильна, але ви можете використовувати категорії для властивостей проксі-сервера, таких як layer.borderColor. (Від ConventionalC CocoaPod)

CALayer + XibConfiguration.h:

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

@interface CALayer(XibConfiguration)

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

@end

CALayer + XibConfiguration.m:

#import "CALayer+XibConfiguration.h"

@implementation CALayer(XibConfiguration)

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

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

@end

Інтерфейс Builder

layer.borderUIColor

Результат буде очевидним під час виконання, а не в Xcode.

Редагувати : Вам також потрібно встановити layer.borderWidthпринаймні 1, щоб побачити межу з обраним кольором.

У Swift 2.0:

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

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

У Swift 3.0:

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

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

Я не можу, щоб це працювало на мене. Файл .m стоїть на borderColor, який повинен бути borderUIColor та виправити його, після цього він все ще показує попередження, і колір межі не відображається під час виконання. Біт, який відрізняється від моєї, - це у мене @ ім'я NameOfFile, а не реалізація CALayer (NameOfFile), я не розумію частину CALayer, чи можете ви пояснити, що більше, будь ласка
Дейв Хей,

2
@PeterDeWeese чудова відповідь! =)
c-

1
Ви фактично можете використовувати Number з borderWidth і приймати NSNumber. Це чудово працює.
Peter DeWeese

1
Це, безумовно, найкраще рішення, на мою думку, для вирішення проблеми BorderColor. Фантастичне використання категорій!
EricWasTaken

1
Працював у Свіфті!
KOTIOS

81

Аналогічна відповідь на одну з iHulk, але у Swift

Додайте файл під назвою UIView.swift у свій проект (або просто вставте його у будь-який файл):

import UIKit

@IBDesignable extension UIView {
    @IBInspectable var borderColor: UIColor? {
        set {
            layer.borderColor = newValue?.cgColor
        }
        get {
            guard let color = layer.borderColor else {
                return nil
            }
            return UIColor(cgColor: color)
        }
    }
    @IBInspectable var borderWidth: CGFloat {
        set {
            layer.borderWidth = newValue
        }
        get {
            return layer.borderWidth
        }
    }
    @IBInspectable var cornerRadius: CGFloat {
        set {
            layer.cornerRadius = newValue
            clipsToBounds = newValue > 0
        }
        get {
            return layer.cornerRadius
        }
    }
}

Тоді це стане доступним у програмі інтерфейсу для кожної кнопки, imageView, мітки тощо на панелі утиліт> Інспектор атрибутів:

Атрибути інспектора

Примітка: межа буде відображатися лише під час виконання.


@Gaurav Яку помилку ви бачите? Для якого компонента (UIButton, UILabel тощо) ви його використовуєте?
Аксель Гільмін

Я не можу вам допомогти без деталей :(
Аксель Гільмін

2
З цим підходом я отримував збої Interface Builder, поки не видалив @IBDesignableз початку розширення.
Альберт Борі

1
Це дивовижно ... Дякую! Я використовую XCode 8.2.1
bobwki

1
Дуже зручно і акуратно! Дякую!
Карл-Джон Чоу

56

Ви можете створити категорію UIView і додати це у .h файл категорії

@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;

Тепер додайте це у .m файл

@dynamic borderColor,borderWidth,cornerRadius;

і це також в. м файл

-(void)setBorderColor:(UIColor *)borderColor{
    [self.layer setBorderColor:borderColor.CGColor];
}

-(void)setBorderWidth:(CGFloat)borderWidth{
    [self.layer setBorderWidth:borderWidth];
}

-(void)setCornerRadius:(CGFloat)cornerRadius{
    [self.layer setCornerRadius:cornerRadius];
}

тепер ви побачите це у вашій дошці для всіх підкласів UIView (UILabel, UITextField, UIImageView тощо)

введіть тут опис зображення

Ось це .. Не потрібно імпортувати категорію нікуди, просто додайте файли категорії в проект і перегляньте ці властивості на дошці.


2
Доповніть його IB_DESIGNABLE, щоб змусити IB перемальовувати власний вигляд, використовуючи drawRect: метод developer.apple.com/library/ios/recipes/…
txulu

3
Це чудово, якщо ви пишете IB_DESIGNABLE у файл .h перед рядком інтерфейсу, вам не потрібно додавати @dynamic рядок у .m
Jasmeet

@ user1618612 це не має нічого спільного з роздільною здатністю, це лише встановлення нормальних властивостей шару.
iHulk

11

Для Swift 3 і 4 , якщо ви готові використовувати IBInspectables, є ось що:

@IBDesignable extension UIView {
    @IBInspectable var borderColor:UIColor? {
        set {
            layer.borderColor = newValue!.cgColor
        }
        get {
            if let color = layer.borderColor {
                return UIColor(cgColor: color)
            }
            else {
                return nil
            }
        }
    }
    @IBInspectable var borderWidth:CGFloat {
        set {
            layer.borderWidth = newValue
        }
        get {
            return layer.borderWidth
        }
    }
    @IBInspectable var cornerRadius:CGFloat {
        set {
            layer.cornerRadius = newValue
            clipsToBounds = newValue > 0
        }
        get {
            return layer.cornerRadius
        }
    }
}

Це найкраще рішення для мене
Mục Đồng

Чудове рішення, дякую u
Ebtehal___

7

хоча це може встановити властивості, воно фактично не відображається в ІБ. Отже, якщо ви по суті пишете код у IB, ви можете також зробити це у своєму вихідному коді


1
Ласкаво просимо до MVC! Ви переглядаєте властивості ніколи не повинні бути в коді!
Алехандро Іван

2
^ Це не MVC.
Ендрю Пламмер

1
Зважаючи на те, що 95% часу цей код йде на контролер, це також MVC, звичайно, якщо ви належним чином підкласируйте або розширите свій погляд, то його справедливу конфігурацію щодо кодування :-)
Даніеле Бернардіні

4

Якщо ви хочете заощадити час, просто використовуйте два UIViewsзверху, один ззаду - колір облямівки, а той, що знаходиться спереду, менший, що надає ефект межі. Я також не вважаю, що це елегантне рішення, але якщо Apple піклується трохи більше, то не варто цього робити.


10
Обхідні шляхи заощаджують час зараз і витрачають набагато більше часу в майбутньому.
Лъчезар Тодоров

0

Це абсолютно можливо лише тоді, коли ви встановлюєте layer.masksToBounds = trueта відпочиваєте.


-1

Робоча дошка не працює для мене весь час, навіть після того, як тут спробували все рішення

Тому завжди ідеальною відповіддю є використання коду. Просто створіть екземпляр IBOutlet UIView та додайте властивості

Коротка відповідь :

layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor

Довга відповідь:

Закруглені кути UIView / UIButton тощо

customUIView.layer.cornerRadius = 10

Прикордонна товщина

pcustomUIView.layer.borderWidth = 2

Колір кордону

customUIView.layer.borderColor = UIColor.blue.cgColor

Питання дуже специфічне, і запитайте, як це зробити у програмі Interface Builder. Ваша відповідь не має значення.
Shinnyx

-5

Будь ласка, додайте ці 2 прості рядки коду:

self.YourViewName.layer.cornerRadius = 15
self.YourViewName.layer.masksToBounds = true

Це буде добре працювати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.