11 iphone uiscrollview ios autolayout nslayoutconstraint
我正在使用Autolayout以编程方式使用UiScrollview和UIPagectontrol创建应用程序
我创建了 TKScroller作为UIView的子类,我使用Some Mode和Array初始化它.
TKScroller.m
-(void)setData{
[self layoutIfNeeded];
CGRect mainFrame=self.frame;
[self layoutIfNeeded];
CGRect mainFrame=self.frame;
UIView *lastview;
NSMutableArray* manualConstraints = [NSMutableArray array];
for (int i=0; i<arrayData.count ; i++)
{
CGRect frame;
frame.origin.x = scrollView.frame.size.width * i;
frame.origin.y = 0;
frame.size = scrollView.frame.size;
UIView *subview = [UIView new];
subview.backgroundColor = [self getRandomColor];
[scrollView addSubview:subview];
if (i==0)
{
NSLayoutConstraint* b1_top = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeTop multiplier:1 constant:5];
[manualConstraints addObject:b1_top];
NSLayoutConstraint* b1_left = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeLeading multiplier:1 constant:5];
[manualConstraints addObject:b1_left];
NSLayoutConstraint* b1_right = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeTrailing multiplier:1 constant:-5];
[manualConstraints addObject:b1_right];
NSLayoutConstraint* b1_bottom = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeTop multiplier:1 constant:-10];
[manualConstraints addObject:b1_bottom];
[subview layoutIfNeeded];
[scrollView addConstraints:manualConstraints];
lastview=subview;
}
else{
NSLayoutConstraint* b1_top = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeTop multiplier:1 constant:5];
[manualConstraints addObject:b1_top];
NSLayoutConstraint* b1_left = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:lastview attribute:NSLayoutAttributeLeading multiplier:1 constant:5];
[manualConstraints addObject:b1_left];
NSLayoutConstraint* b1_right = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeTrailing multiplier:1 constant:-5];
[manualConstraints addObject:b1_right];
NSLayoutConstraint* b1_bottom = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeTop multiplier:1 constant:-10];
[manualConstraints addObject:b1_bottom];
[subview layoutIfNeeded];
[scrollView addConstraints:manualConstraints];
lastview=subview;
}
}
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * arrayData.count, mainFrame.size.height/2);
self.pageControl.currentPage = 0;
self.pageControl.numberOfPages = arrayData.count;
pageControlBeingUsed = NO;
}
-(UIColor *)getRandomColor{
int r = arc4random() % 255;
int g = arc4random() % 255;
int b = arc4random() % 255;
return [UIColor colorWithRed:(r/255.0) green:(g/255.0) blue:(b/255.0) alpha:1.0];
}
Run Code Online (Sandbox Code Playgroud)
现在我得到任何子视图,
但是,如果我改变方向,它将给出不正确的结果,那么我如何给出NSLayoutConstraintscrollview的子视图?
编辑
添加NSLayoutConstraint子视图后未显示.我只是缺少一些约束,请在动态设置约束时纠正我.
我的源代码在这里,请帮助我.谢谢.抱歉语法不好.
Anc*_*inu 10
根据我的经验AutoLayout(我也以编程方式使用).您不应该直接向您的视图添加视图UIScrollView.
你应该UIView 只做一个,你添加为你的子视图UIScrollView.
完成此操作后,您可以将所有子视图添加到此UIView.
这里详细解释了一切:Apple iOS技术说明TN2154
这是一个SO答案已经解释了如何使用自动布局,他已经完美地解释了,在这里有垂直文本字段,但在你的情况下,你必须设置水平视图约束.
替代
而不是设置约束,您可以设置子视图的框架并在Scrollview中设置它,并且根据方向,您可以更改滚动视图的子视图的框架.
你的setData方法如,
-(void)setData{
[self layoutIfNeeded];
CGRect mainFrame=scrollView.frame;
CGRect frame;
for (int i=0; i<arrayData.count ; i++)
{
CGRect frame;
frame.origin.x = scrollView.frame.size.width * i;
frame.origin.y = 0;
frame.size = scrollView.frame.size;
frame.origin=CGPointMake(0, 0);
UIView *subview = [[UIView alloc]initWithFrame:frame];
subview.backgroundColor = [self getRandomColor];
[scrollView addSubview:subview];
}
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * arrayData.count, mainFrame.size.height/2);
}
Run Code Online (Sandbox Code Playgroud)
现在你使用NSNotificationCenter,你可以在设备方向变化时获得通知,所以在这个选择器方法中调用你的setData方法,
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(setData)
name:UIDeviceOrientationDidChangeNotification
object:nil];
Run Code Online (Sandbox Code Playgroud)
现在在setData方法中,您需要删除所有子视图,因为当设备更改方向时,它会向您的滚动视图添加新视图,因此在设置其框架之前从Scrollview中删除所有子视图,
[scrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
Run Code Online (Sandbox Code Playgroud)
确保你要从你的班级中删除观察者,比如
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
Run Code Online (Sandbox Code Playgroud)
我知道问题已经解决了.我希望这个解决方案能帮助一些人,所以我发布了它.
下面的代码用于将scrollview添加到uiviewcontroller
self.scrollView = UIScrollView()
self.scrollView.backgroundColor = UIColor.greenColor()
self.scrollView.setTranslatesAutoresizingMaskIntoConstraints(false)
self.scrollView.scrollEnabled=true
self.scrollView.pagingEnabled = true
self.view.addSubview(self.scrollView)
self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[scrollView]|", options: NSLayoutFormatOptions(0), metrics: nil, views: ["scrollView":self.scrollView]))
self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[scrollView]|", options: NSLayoutFormatOptions(0), metrics: nil, views: ["scrollView":self.scrollView]))
Run Code Online (Sandbox Code Playgroud)
添加了scrollview并添加了这样的子视图/图像(这是以照片应用程序的形式显示滚动视图的完整大小的图像的示例)
var prev:UIImgeView?
for var index = 0; index < self.images.count; ++index {
var iview = UIImgeView()
iview.setTranslatesAutoresizingMaskIntoConstraints(false)
self.scrollView.addSubview(iview)
var image = self.images.objectAtIndex(index) as UIImage
iview.image = image
if (index == 0){
self.scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[iview(==scrollView)]", options: NSLayoutFormatOptions(0), metrics: nil, views: ["iview":iview,"scrollView":self.scrollView]))
prev = iview
}
else{
self.scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[prev][iview(==prev)]", options: NSLayoutFormatOptions(0), metrics: nil, views: ["iview":iview,"prev":prev!]))
prev = iview
}
self.scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[iview(==scrollView)]|", options: NSLayoutFormatOptions(0), metrics: nil, views: ["iview":iview,"scrollView":self.scrollView]))
if (index == self.images.count-1){
self.scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[prev]|", options: NSLayoutFormatOptions(0), metrics: nil, views: ["prev":prev!]))
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26666 次 |
| 最近记录: |