2014-09-26 145 views
1

我在界面生成器中有一个UICustomButton(UIButton的子类)。我想在UICustomButton里面改变这个按钮的框架。如何以编程方式更改UIView子类内的UIView框架?

我尝试下面的代码:

// make it 10 points wider and higher 
CGRect newFrame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width + 10, self.frame.size.height + 10); 
self.frame = newFrame; 

awakeFromNib:, drawRect:

他们没有工作,其结果是不变的。

+0

不清楚_when_(=在哪个事件之后)要更新帧,但是如果它与init过程相关,那么'-initWithFrame:'或'-didMoveToSuperview'方法可能是更好的地方这样的事情 - 请记住,自动布局功能可能会覆盖您的帧值。 – holex 2014-09-26 15:39:47

+0

@holex我想在视图启动过程中只更新一次框架。 'initWithFrame:'不起作用,因为只有'initWithCoder:'被调用。另外,如何禁用此特定视图的自动布局? – DavidLiu 2014-09-26 19:06:59

+0

您需要禁用特定视图的_superview_中的自动布局 - 这可能对您有所帮助。 – holex 2014-09-27 13:20:41

回答

2

awakeFromNibdrawRect:都不合适。

您可以更改其框架layoutSubviews,但如果您的应用使用自动布局,则可能会遇到麻烦。

+0

如果您的应用使用自动布局,请查看'updateConstraints'方法。 – atreat 2014-09-26 15:35:08

+0

刚试过'layoutSubviews',它不起作用。我正在使用故事板,但没有明确设置自动布局约束。 – DavidLiu 2014-09-26 15:36:02

0

我把它放在viewDidLoad中。如果您将其置于循环方法中,则每次调用时它的大小都会增加。

+1

UIView没有'viewDidLoad',它属于'UIViewController' – DavidLiu 2014-09-26 15:36:48

+0

在viewDidLoad中的大小是不好的。没有办法对屏幕尺寸变化做出反应。例如:旋转! – fat 2014-09-26 15:40:28

+0

您的自定义按钮是UIView的子类,它是viewController的UIView的子视图。这通常是显示视图时进行最后一分钟更改的地方。按钮通常不会在旋转时调整大小,只是重新定位,但如果您需要在旋转时调整大小,则可以在旋转代码中执行此操作。你所拥有的代码不会进行轮换,因为每次调用它都会使按钮变大。 – 2014-09-26 15:52:44

2

不要这样做!这是糟糕的建筑!

视图不应该改变它自己的框架。它始终是调整其子级的父视图。 如果您检测到视图内需要另一个框架:向父视图发送委托调用并更改其中的框架。委托方法可能看起来像这样

- customButton:(UIButton *)button requestNewFrame:(CGRect)frame 
{ 
    button.frame = newFrame; 
    // some storing method so you remember the frame on rotations and stuff 
} 

正如一个提醒:孩子的观点总是在

- (void)layoutSubviews //UIView 
- (void)viewDidLayoutSubviews //UIViewController 

使您的代码安全的不同UIInterfaceOrientations和不同的设备调整。

+0

谁说视图不能改变自己...?没有人,所以...为什么它会是一个糟糕的建筑? – holex 2014-09-26 15:49:05

+1

@胖子的权利。为了调整自己的观点,它需要了解一些关于视图外的情况 - 这是不好的区隔,这就是我们使用对象的原因。对象应该做他们知道该怎么做的事情,而不是从外面获取信息。 – 2014-09-26 15:55:50

+0

@OwenHartnett,如果你想通知对象之外的任何类,就有_delegates_的模式,通过_notification center_发送一个简单的nofitication,或者在类的某个属性上使用_KVO_。 OOP的_encapsulation_功能也是关于隐藏来自外部对象的信息。所以,我的问题仍然是一样的,它怎么会是一个糟糕的架构呢? – holex 2014-09-27 13:14:57

相关问题