2012-04-17 29 views
11

我正在嘗試創建&對於具有圓角的矩形,使用一個非常簡單的UIView子類。我創建了一個新的類,如下所示:iOS - 爲圓角矩形創建UIView子類

RoundedRect.h

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

@interface RoundedRect : UIView 
@end 

RoundedRect.m

#import "RoundedRect.h" 

@implementation RoundedRect 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     [[self layer] setCornerRadius:10.0f]; 
     [[self layer] setMasksToBounds:YES]; 
    } 
    return self; 
} 
@end 

我使用的是iOS 5.1故事板,並且已經設置了自定義類財產IB檢查器窗口改爲'RoundedRect',但是當我運行應用程序時,矩形仍然有方角。我錯過了明顯的東西嗎?

由於 喬納森

回答

9

當視圖是從XIB文件實例化不被調用的方法initWithFrame。而是調用初始化程序,因此您需要在此方法中執行相同的初始化。

+0

非常感謝,這是做的伎倆! – 2012-04-17 11:58:29

+0

我傾向於在'-awakeFromNib'中做額外的設置。這有什麼問題嗎? – d11wtq 2013-02-16 00:50:27

+1

區別在於,一旦所有對象從XIB加載完成,就會發送'awakeFromNib'。它可能會或可能不是我們想要的,我想在很多情況下根本就沒有關係。 – Krumelur 2013-02-16 09:16:39

3

對於從NIB文件加載的視圖,指定的初始化程序爲initWithCoder:。在這種情況下不調用initWithFame:

17

的其他人已經回答了這個問題,但我會重構它這樣在筆尖和代碼允許使用

#import "RoundedRect.h" 

@implementation RoundedRect 

- (id)initWithFrame:(CGRect)frame; 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     [self commonInit]; 
    } 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder; 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     [self commonInit]; 
    } 
    return self; 
} 

- (void)commonInit; 
{ 
    CALayer *layer = self.layer; 
    layer.cornerRadius = 10.0f; 
    layer.masksToBounds = YES; 
} 

@end 
22

在iOS 5中和起來,就完全沒有必要的子類 - 你可以從Interface Builder中完成。

  1. 選擇您想要修改的UIView。
  2. 轉到Identity Inspector。
  3. 在「用戶定義的&運行時屬性」中,在關鍵路徑中添加「layer.cornerRadius」,類型應該是「Number」以及您需要的任何設置。
  4. 還要將'layer.masksToBounds'添加爲布爾值。
  5. 完成!沒有子類,全部在IB。
0

如果從筆尖的UIView負荷,你應該使用方法

- (void)awakeFromNib