本课程将对直立图像进行透视。
它可以完美运行,但不能在带有 IBDesignable 的 Storyboard 中实时运行。这是非常可悲的。
是否可以使用 CATransform3D 等在带有 IBDesignable 的 Storyboard 上进行实时显示?
// Twist.swift .. twist on Y, perspective from the left
import UIKit
@IBDesignable
class Twist:UIViewController
{
@IBInspectable var perspective:CGFloat = 0.5 // -1 to 1
@IBOutlet var im:UIView! // the image you want to twist on y
override func prepareForInterfaceBuilder()
{ twist(perspective) }
override func viewDidAppear(animated: Bool)
{
twist(perspective)
super.viewWillAppear(animated)
}
func twist(f:CGFloat) // -1 to 1
{
// hinge around left edge
im.layer.anchorPoint = CGPointMake(0, 0.5) …Run Code Online (Sandbox Code Playgroud) 我创建了一个 @IBDesignable 子类 UIView
该视图有几个标签和一个文本字段。
当我尝试在故事板中更改它们的值时,不会呈现这些更改。在cornerRadius 的不断变化中,borderWidth 和borderColor 在故事板上呈现。
我错过了什么?
这是它在故事板中的样子:
这是它在模拟器中的外观以及我希望它在渲染后在故事板中的外观:
这是该类的代码:
import UIKit
@IBDesignable
class LoginTextField: UIView {
@IBInspectable var cornerRadius: CGFloat = 0 {
didSet {
layer.cornerRadius = cornerRadius
layer.masksToBounds = cornerRadius > 0
}
}
@IBInspectable var borderWidth: CGFloat = 0 {
didSet {
layer.borderWidth = borderWidth
}
}
@IBInspectable var borderColor: UIColor? {
didSet {
layer.borderColor = borderColor?.cgColor
}
}
@IBInspectable var title: String = "" {
didSet {
titleLabel.text = title
} …Run Code Online (Sandbox Code Playgroud) 我创建了一个自定义的IB可设计视图(请参阅下面的代码),它在IB中正确呈现,并且在运行时也能正常工作.但是,在获取有关视图错位的警告时,我无法在Interface Builder中手动调整视图大小(当触摸调整大小手柄时,视图将在其容器中跳转).
我对各种不同的布局都有相同或类似的行为.如果我在这里做错了,或者这只是IB中的一个错误,你有没有想法?
(PS:我不能忽视警告)

编辑:添加约束的截图:

这是代码(标题):
IB_DESIGNABLE
@interface AKATestView : UIView
@end
Run Code Online (Sandbox Code Playgroud)
执行:
@interface AKATestView()
@property(nonatomic)BOOL subviewsCreated;
@property(nonatomic)BOOL subviewConstraintsCreated;
@property(nonatomic)NSDictionary* views;
@end
@implementation AKATestView
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
[self setupAfterInit];
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self setupAfterInit];
}
return self;
}
- (void)setupAfterInit
{
[self createSubviews];
}
- (void)createSubviews
{
if (!self.subviewsCreated)
{
self.translatesAutoresizingMaskIntoConstraints = NO;
UILabel* labelView = [[UILabel alloc] initWithFrame:CGRectZero];
labelView.text = …Run Code Online (Sandbox Code Playgroud) 我在OS X应用程序中实现了一个自定义控件,工作正常.绘制控件时,它使用来自非系统框架的代码.控件是用swift编写的,框架在Objective-C中.框架不与具有自定义控件的应用程序构建在同一项目或工作区中.我已将Framework添加到目标并将其添加到复制文件构建阶段.
当我在swift中将IBDesignable修饰添加到自定义控件类时,在尝试在Interface Builder中查看控件时出现错误.我得到的错误是:
file:///Users/ktam/github/MovingImagesDemo/Spinner2/SpinnerController.xib: error: IB Designables: Failed to render instance of Spinner:
dlopen(Spinner2.app, 1): Library not loaded: @executable_path/../Frameworks/MovingImages.framework/Versions/A/MovingImages
Referenced from: Spinner2.app
Reason: image not found
当我检查在IBDesignables子文件夹中创建的应用程序包时,框架位于应用程序包中的正确位置.我假设在这种情况下实际运行的可执行文件不是IBDesignables应用程序包中的可执行文件,但可能是某种类型的Interface Builder可执行文件,这解释了为什么无法加载Framework图像.
加载Interface Builder在使用IBDesignable呈现视图时可以找到的代码,我需要做什么?
进一步测试后的信息:
我重新构建框架,同时指定安装目录为〜/ Library/Frameworks,然后将构建的Framework复制到该位置,然后我更新了应用程序目标,以便包含〜/ Library/Frameworks以及应用程序和接口的Runpath搜索路径Builder现在正确绘制自定义控件.
这不是我需要的解决方案,但它指出了问题所在,我仍然需要弄清楚正确的解决方案是什么.
基本上,我有一个视图,其中可以有无限量的UIViews.我希望能够设置self.numberOfSections = 8或self.numberOfSections = 2然后UIImages分别生成相同数量的生成,然后可以进行操作.
目前IBInspectible我的代码中有很多图像,无论我有2个numberOfSections还是100个numberOfSections.我想以某种方式能够UIImages基于我的numberOfSections数字创建.
如果我在这里将Number Of Sections设置为2 - 我可以在故事板中设置图像,但是所有其他IBInspectable元素也会显示为不会被使用,因为只有2个部分.有没有办法只显示所需的那些?我想在故事板中设置图像.有没有办法重构这一点,以便没有这么多的IBInspectables?
这就是我如何将图像设置为代码中各种以编程方式生成的视图.
-(void)drawRect:(CGRect)rect
for (int i = 0; i < self.numberOfSections; i++) {
NSString *rotaryName = [NSString stringWithFormat:@"rotaryImage%d", i + 1];
id rotaryNameValue = [self valueForKey:rotaryName];
[self.sectorView setValue:rotaryNameValue forKey:@"image"];
}
}
Run Code Online (Sandbox Code Playgroud) 现在,我正在创建一个自定义视图,并且想知道如何interface builder确定何时引入一行。
如您所见,它分为3个部分。sub groups但是我想知道如何确定子组的开始和结束位置。
因为我所做的就是IBInspectables像这样在彼此之间创建了底层。
@IBInspectable var dotCount: Int = 0 { didSet { setup() } }
@IBInspectable var dotSize: CGFloat = 7 { didSet { dotSize = dotSize + 1.5 } }
@IBInspectable var dotSpacing: CGFloat = 10
@IBInspectable var dotColor: UIColor = UIColor.clear {
didSet {
for dot in dots {
if let dot = dot, dot != selectedView {
dot.backgroundColor = dotColor
}
}
}
}
@IBInspectable var borderWidth: CGFloat = …Run Code Online (Sandbox Code Playgroud) 我想从@IBInspectabale创建键盘选择
如何做到这一点
我正在创建一个视图,在其中插入ImageView和TextField,现在,我将该自定义视图类创建为@IBDesignable并创建了@IBInspectable元素。
我成功创建了侧面图像和占位符元素,但是现在我尝试创建键盘类型,但遇到了问题。
代码片段:`import UIKit
@IBDesignable类CustomTextField:UIView,UITextFieldDelegate {
//custom view from the XIB file
var view: UIView!
@IBOutlet weak var textField: UITextField!
@IBOutlet weak var imageView: UIImageView!
override init(frame: CGRect) {
super.init(frame: frame)
loadViewFromNib ()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
loadViewFromNib ()
}
func loadViewFromNib() {
let bundle = Bundle(for: type(of: self))
let nib = UINib(nibName: "CustomTextField", bundle: bundle)
let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
view.frame = bounds
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
self.addSubview(view);
} …Run Code Online (Sandbox Code Playgroud) 我可以在模拟器上查看使用IBInspectable所做的更改,但不能在情节提要中查看
我尝试重新安装Xcode,但没有解决此问题。这是一些屏幕截图:


因此,我知道我的代码运行正常,因为它在模拟器中运行,并且这是一个新项目,因此我没有任何“ Storyboard可能仍在加载更改”的问题。
import UIKit
extension UIView {
@IBInspectable
var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set {
layer.cornerRadius = newValue
layer.masksToBounds = newValue > 0
}
}
@IBInspectable
var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set {
layer.borderWidth = newValue
}
}
@IBInspectable
var borderColor: UIColor? {
get {
let color = UIColor(cgColor: layer.borderColor!)
return color
}
set {
layer.borderColor = newValue?.cgColor
}
}
@IBInspectable
var shadowRadius: CGFloat {
get {
return layer.shadowRadius
} …Run Code Online (Sandbox Code Playgroud) 我看到了很多与此相关的问题,但答案很少(一个答案解决了之前的类似问题,但没有解决这个问题)。
问题
我有一个 IBDesignable 课程。它派生自 UIControl,但如果我派生自 UIView,也会发生同样的情况。
它基本上看起来像这样:
@IBDesignable
open class RVS_Checkbox: UIControl { ... }
Run Code Online (Sandbox Code Playgroud)
它工作得很好(链接指向这个项目,它是一个“插入式”UIControl 类)。
但它不会在 Interface Builder 中呈现。我收到此错误:
这是错误,逐字:
The built product "/Volumes/Development/Developer/Xcode/DerivedData/RVS_Checkbox-ficjiiqrddckmjenmsrbrxvihaky/Build/Intermediates.noindex/IBDesignables/Products/Debug-appletvsimulator/RVS_Checkbox" does not exist in the file system. Make sure your built products contains either an application or a framework product.
Run Code Online (Sandbox Code Playgroud)
首先,这是一个 tvOS 错误,并且这是一个仅限 iOS 的类。我之前也遇到过类似的问题,这个答案为我解决了这个问题。我将代码包装在 #if...#else...#endif 中,如下所示:
#if os(iOS)
@IBDesignable
open class RVS_Checkbox: UIControl { ... }
#else
@IBDesignable
class RVS_Checkbox: UIView { }
#endif …Run Code Online (Sandbox Code Playgroud) 我有一个按钮的自定义类.
import UIKit
@IBDesignable
class CustomButton: UIButton {
@IBInspectable var cornerRadiusValue: CGFloat = 10.0 {
didSet {
setUpView()
}
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.layer.cornerRadius = 10.0
}
override func awakeFromNib() {
setUpView()
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
setUpView()
}
func setUpView() {
self.layer.cornerRadius = 10.0
}
}
Run Code Online (Sandbox Code Playgroud)
但是角落半径没有显示在故事板中的按钮上.
我理解@IBInspectable只允许您更改检查器面板中的值.我想这不是我想要的.
当我创建一个具有该类的按钮时,我希望角落半径只显示在故事板中.我认为这就是@IBDesignable的作用.
ibdesignable ×10
ios ×7
swift ×6
xcode ×2
autolayout ×1
calayer ×1
keyboard ×1
objective-c ×1
osx-yosemite ×1
uibutton ×1
uiimage ×1
uistoryboard ×1
xcode6 ×1
xcode7 ×1