当我的主视图旋转时,我想重新排列子视图,所以在我的ViewController中,我重写
willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration
Run Code Online (Sandbox Code Playgroud)
并在那里设置子视图的帧.这一切都很好,但在子视图中我也被覆盖了
layoutSubviews
Run Code Online (Sandbox Code Playgroud)
所以他们正确地布置自己.但问题是这个现在被调用两次 - 大概一次我在willAnimateRotationToInterfaceOrientation中设置Frame而一次因为旋转而设置.(如果我没有设置Frame,它会被调用一次.)
当然,ViewController负责布局框架,这看起来像是一个设计缺陷 - 什么是解决方案,所以layoutSubviews只调用一次?
我通过使用UIPageViewController在应用程序中实现水平滚动,我将导航属性设置为"Horizontal",将Transistion Style设置为"scroll".一切正常,我可以添加一些正确呈现的子视图.我还想通过使用这两种方法来利用UIPageViewController所具有的内置UIPageControl:
-(NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController
-(NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
Run Code Online (Sandbox Code Playgroud)
这实际上显示了我正在寻找的东西:指示显示哪个子视图的点.但是,正如您在图像中看到的那样,UIPageControl设置在父视图控制器(UIPageViewController)的底部.您可以想象这不是我想要呈现我的UIPageControl的方式.有没有办法可以操作父视图控制器,以便子视图位于UIPageControl下面?还是有其他好的做法来实现这一目标吗?我知道我可以通过使用scrollView而不是UIPageViewController来实现水平滚动,但这似乎对我来说效率更高.
http://i48.tinypic.com/2hd03ev.png
为清晰起见:灰色部分是我的子视图,红色部分是我正在使用的底层UIPageViewController.
提前感谢您的回答!
objective-c uipagecontrol layoutsubviews uipageviewcontroller
我有两种状态UIView
:
@IBaction
我在它们之间使用for进行动画button
:
@IBAction func tapped(sender: UIButton) {
flag = !flag
UIView.animateWithDuration(1.0) {
if self.flag {
NSLayoutConstraint.activateConstraints([self.myConstraint])
} else {
NSLayoutConstraint.deactivateConstraints([self.myConstraint])
}
self.view.layoutIfNeeded() //additional line
}
}
Run Code Online (Sandbox Code Playgroud)
仅当我添加附加行时动画才起作用:
但是当我删除该行时,我的UIView
就会更新但没有任何动画,它会立即发生。
为什么这条线会产生如此大的差异?运作如何?
我一直试图UITableViewCell
通过Autolayout 创建复杂但是它在滚动时给出了巨大的性能滞后,所以我决定采用基于帧的方式,即以编程方式.
单元格布局的复杂性就像Facebook卡片,其中每个单元格与动态文本和图像不同.
我试图渲染单元格,layoutSubviews
但滚动仍然很差,但比Autolayout更好.
我也尝试渲染单元格drawRect
,这提供了最佳性能但滚动时我无法更新帧,因为它只被调用一次.
有人可以指导我最好的情况,我可以用最好的滚动性能.我被卡住了.
考虑一个带有自定义背景的视图drawRect:
.如果视图更改大小,则需要重新绘制背景.
这是一个坏主意吗?
- (void) layoutSubviews
{
[super layoutSubviews];
[self setNeedsDisplay];
}
Run Code Online (Sandbox Code Playgroud)
如果是,考虑到我无法控制谁更改视图的大小,那么什么是更好的选择呢?
我正在尝试为某些子视图创建自定义布局.我的文件是a ViewController
,所以我必须将其视图称为self.view
.子视图是子视图self.view
.
当我[self layoutSubviews];
明确调用时viewDidLoad
,它会-layoutSubviews
毫无问题地执行代码.
但是,我已经读过,我不应该-layoutSubviews
明确地打电话,或者打电话给它,self
因为那是一个UIViewController
.我尝试-setNeedsLayout
通过这样调用它来实现:[self.view setNeedsLayout]
in viewDidLoad
,并取出显式调用-layoutSubviews
但保留其声明.但这似乎不起作用.
我被链接到一篇关于何时调用layoutSubviews的文章,似乎应该在我添加子视图时调用它,但这似乎不会发生在这里.
如果我想要安全,并按照它在类引用UIView
及其方法中的建议做事,那么我应该如何使用这两种方法呢?
我真的很困惑,当我在子视图上使用自动布局时,layoutSubview方法无限循环.
我所做的只是:
- (id)init
{
self = [super init];
if(self)
{
self.backgroundColor = [UIColor grayColor];
_imageView = [[UIImageView alloc] init];
_imageView.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:_imageView];
[self applyConstraints];
}
return self;
}
-(void)applyConstraints
{
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[_imageView]-0-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_imageView)]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[_imageView]-0-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_imageView)]];
}
Run Code Online (Sandbox Code Playgroud)
这会在layoutSubviews中导致无限循环.实际上,即使没有调用applyConstraints,也会发生循环,阻止它发生的唯一方法是将'translatesAutoresizingMaskIntoConstraints'设置为YES.
有没有人遇到/解决过这个问题?
更新 只是为了澄清,这是一个UIView子类,在视图控制器中使用.视图本身不使用自动布局,而是在初始化后将帧设置为旧式.
我正在尝试对IOS中的layoutSubviews函数进行逆向工程,它会计算自动调整大小和约束.通常,如果我们在订单中创建约束:A取决于(约束)B,B取决于C,并且C使用固定框架,系统应该足够智能以按顺序实现计算:C - > B - > A以避免不必要的循环.
我的问题是:IOS(或算法是什么)如何遍历NSLayoutContraint列表并按此顺序计算帧?
我正在调整Objective-C库(STKSpinnerView)到Swift,我无法解决这个错误:
func getRadius() -> CGFloat {
var r : CGRect = CGRectInset(self.bounds, self.wellThickness/2.0, self.wellThickness/2.0)
var w : CGFloat = r.size.width
var h : CGFloat = r.size.height
if w > h {
return h/2.0
}else{
return w/2.0
}
}
override func layoutSubviews() {
super.layoutSubviews()
var bounds : CGRect = self.bounds
var wt : CGFloat = self.wellThickness
var outer : CGRect = CGRectInset(self.bounds, wt/2.0, wt/2.0)
var inner : CGRect = CGRectInset(self.bounds, wt, wt)
var innerPath : UIBezierPath = UIBezierPath(ovalInRect: inner) …
Run Code Online (Sandbox Code Playgroud) 在我的UICollectionViewCell类中,我写了这个:
- (void)layoutSubviews {
[super layoutSubviews];
self.myImageView.layer.cornerRadius = CGRectGetHeight(self.myImageView.frame) / 2;
self.myImageView.layer.masksToBounds = YES;
}
Run Code Online (Sandbox Code Playgroud)
但这在所有情况下都无法正常工作,它看起来像这样:
layoutsubviews ×10
ios ×7
objective-c ×3
swift ×3
autolayout ×2
drawrect ×2
algorithm ×1
calayer ×1
cocoa-touch ×1
constraints ×1
iphone ×1
rotation ×1
uibezierpath ×1
uiimageview ×1
uitableview ×1
uiview ×1