Подкласс UIView
не так уж важен для понимания таких методов, как -(void)addView:toRightOfView:
и т. Д. Вы можете делать это по ходу, портируя только те методы, которые вам нужны.Затем вы можете вызвать их в переопределении layoutSubviews
, как указывает Бенджамин.
Представления могут быть построены с использованием IB, или они могут быть написаны программно;Android хорошо зарекомендовал себя в создании удобочитаемых макетов, и вы можете использовать это преимущество для представлений iOS, созданных программным способом.То, что iOS-устройств немного, означает, что помимо читабельности нет (пока?) Многих практических преимуществ для этого шаблона.
Примечание.Файл "XIB" является файлом XML.Откройте его в своем любимом текстовом редакторе и посмотрите.
** РЕДАКТИРОВАТЬ.
Вот быстрый пример, который я обнаружил.Это не было проверено, но кое-что как это будет работать в вашем подклассе UIView
(назовите это UIRelativeView
возможно).
- (void) addSubview:(UIView *) viewOne
toRightOfSubview:(UIView *) viewTwo
{
if (viewTwo == nil ||
[self.subviews contains:viewTwo] == NO)
{
[self addSubview:viewOne];
}
else
{
CGRect frameTwo = viewTwo.frame;
CGPoint originOne = CGPointMake(frameTwo.origin.x + frameTwo.size.width,
frameTwo.origin.y);
CGRect frameOne = CGRectZero;
frameOne.origin = originOne;
frameOne.size = viewOne.frame.size;
[viewOne setFrame:frameOne];
[self addSubview:viewOne];
}
}
- (void) moveSubview:(UIView *) viewOne
toRightOfSubview:(UIView *) viewTwo
{
if (viewTwo == nil ||
[self.subviews contains:viewTwo] == NO)
{
[self addSubview:viewOne];
}
else if ([self.subviews contains:viewOne] == NO)
{
[self addSubview:viewOne toRightOfSubview:viewTwo];
}
else
{
CGRect frameTwo = viewTwo.frame;
CGPoint originOne = CGPointMake(frameTwo.origin.x + frameTwo.size.width,
frameTwo.origin.y);
CGRect frameOne = CGRectZero;
frameOne.origin = originOne;
frameOne.size = viewOne.frame.size;
[viewOne setFrame:frameOne];
}
}