iOS 自訂控制項開發(中),ios控制項
《iOS 自訂控制項開發(上)》
《iOS 自訂控制項開發(中)》
接上篇iOS自訂控制項開發之後,我們嘗試另外一種。
在Xcode的右邊,會看到如下的圖
其中,上面有一個:Custom Class。
那就是代表著我們可以直接使用這個Custom Class來自訂我們的類咯~
#0 第一次嘗試
將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;
方法。聲明以及實現均需要刪除。
然後再次運行我們的代碼,出現如下情況
後續嘗試過很多種方法進行修改,但是均沒有成功。第一次嘗試失敗。
#1 第二次嘗試
經過分析,的原因在於初始化時沒有設定背景色,即:
- (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];}
出現如下的問題:
可以很明顯的看出,當介面旋轉後,出現了變形的情況。所以,請保留此方法。
#2 終極方案
綜合上述:
自訂控制項,繼承自UIView,在Storyboard中修改Custom Class綁定到我們的自訂控制項中。
自訂控制項需要實現initWithCoder方法,Storyboard會自動調用此方法進行初始化。
然後修改drawRect方法開始繪製自訂控制項內容。
最後,不要忘記在layoutSubviews方法中調用setNeedsDisplay進行重新整理。
至此,自訂控制項在執行個體化的階段就完成了。我們在調用的時候,可以以非常簡單方便的方式來使用。