接上篇iOS自定義控件開發之后,我們嘗試另外一種。
在Xcode的右邊,會看到如下的圖
其中,上面有一個:Custom Class。
那就是代表著我們可以直接使用這個Custom Class來自定義我們的類咯~
將Class字段填入我們所寫的自定義控件名。
然后修改我們上次寫的ChartViewController文件。刪除之前的關聯,重新關聯這個View。
//// ChartViewController.h//// Created by Luna Gao on 15/10/29.// Copyright © 2015年 zhiqiankeji.com. All rights reserved.//#import <UIKit/UIKit.h>#import "LGChartView.h"#import "Hardware.h"@interface ChartViewController : UIViewController@PRoperty (weak, nonatomic) IBOutlet LGChartView *chartView;@end
之后刪除掉viewDidLoad中所有的實例化代碼,就像我們使用UILabel等原生控件一樣,不再去實例化對象。
- (void)viewDidLoad { [super viewDidLoad];}
之后再修改LGChartView,刪除之前我們自定義的
- (instancetype)initWithParentView:(UIView*) view;
方法。聲明以及實現均需要刪除。
然后再次運行我們的代碼,出現如下情況
后續嘗試過很多種方法進行修改,但是均沒有成功。第一次嘗試失敗。
經過分析,上圖的原因在于初始化時沒有設置背景色,即:
- (instancetype)initWithFrame:(CGRect)frame{ frame = CGRectMake(0, 0, parentView.frame.size.width, parentView.frame.size.height); self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor clearColor]; self.autoresizesSubviews = YES; self.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; } return self;}
之前我們這段代碼中的
self.backgroundColor = [UIColor clearColor];
這句代碼,并沒有執行。
嘗試放在init方法中,不執行。
嘗試放在initWithFrame方法中,不執行。
嘗試放在initWithCoder方法中,成功?。ú敛敛粒。?!這方法我是無聊的時候隨便試了一下,結果成功了···坑爹啊,從來沒用過這個方法···沒想到啊···)
這之后就簡單多了~
將之前的這些設置自適應大小的代碼均可刪掉。
self.autoresizesSubviews = YES; self.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
刪除無用的代碼,簡化一下,期間不小心刪掉了自定義控件中的
-(void)layoutSubviews { [self setNeedsDisplay];}
出現如下的問題:
可以很明顯的看出,當界面旋轉后,出現了變形的情況。所以,請保留此方法。
綜合上述:
自定義控件,繼承自UIView,在Storyboard中修改Custom Class綁定到我們的自定義控件中。
自定義控件需要實現initWithCoder方法,Storyboard會自動調用此方法進行初始化。
然后修改drawRect方法開始繪制自定義控件內容。
最后,不要忘記在layoutSubviews方法中調用setNeedsDisplay進行刷新。
至此,自定義控件在實例化的階段就完成了。我們在調用的時候,可以以非常簡單方便的方式來使用。
新聞熱點
疑難解答