UISCrollViewでプログラムでサブビューを設定する方法 -- ios フィールド と iphone フィールド と uiscrollview フィールド と autolayout フィールド と nslayoutconstraint フィールド 関連 問題

How to set subviews with AutoLayout in UIScrollView programmatically?












12
vote

問題

日本語

のために、プログラムでオートライアウトを使用してUISCROLLVIEWとUIPAgECTONTROLを使用したアプリを作成しています。

tkscroller をUViewのサブクラスとして作成しました。

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]; }

今私はサブビューを手に入れています、

しかし、私が向きを変えると誤った結果が与えられるので、ScrollViewのサブビューのための NSLayoutConstraint を与えることができますか?

編集

NSLayoutConstraint サブビューを追加した後は表示されません。私は一部の制約を欠いているだけです、制約を動的に設定してください。

my ソースコード < / strong>、私を助けてください。 ありがとうございました。そして悪い文法のためにすみません。

英語

I am creating app with UiScrollview and UIPagectontrol using Autolayout Programmatically, for

I have Created TKScroller as subclass of UIView, I am init it using Some Mode and 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]; } 

Right now i am getting any subviews,

but if i change orientation it will give incorrect result, So how can i give NSLayoutConstraint for subviews of scrollview ?

EDIT

After adding NSLayoutConstraint subviews are not shown. I am just missing some constraint , please correct me in setting constraints dynamically.

My Source Code is here , Please Help Me. Thank you. And Sorry for bad grammar.

</div
              
         
         

回答リスト

6
 
vote
vote
ベストアンサー
 

これはこんな回答が自動レイアウトでこれを行う方法を説明しました、彼はここでは完全に説明しました。垂直方向にテキストフィールドがありますが、あなたの場合には、水平方向の見方を設定する必要があります。

代替

むしろ制約の設定サブビューのフレームだけを設定し、ScrollViewで設定し、その方向に基づいてScrolViewのサブビューのフレームを変更できます。

あなたの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); }

NSNotificationCenterを使用すると、デバイスの向きが連れて行くときに通知することができるので、<コード> m.options.IMODE=60 メソッドを呼び出すことで、

を呼び出します。 <事前> <コード> m.options.IMODE=61

SetDataメソッドScrollViewに新しいビューを追加すると、そのフレームを設定する前にScrollViewからすべてのサブビューを削除するため、ScrollViewからすべてのサブビューを削除する必要があるため、すべてのサブビューを削除する必要があるため、ScrollViewからすべてのサブビューを削除するため、

<事前> <コード> m.options.IMODE=62

あなたがクラスのようにオブザーバーを削除していることを確認してください。

<事前> <コード> m.options.IMODE=63
 

Here is a SO answer has explained how to do this with auto layout, he has explain perfectly , In here there is vertically textfields are there But in your case it is you have to set Horizontal views constraints.

Alternative

Rather that setting constraints you can set just frame of the subview and set it in Scrollview, And based on orientation you can change frames of the scrolview's subviews.

Your setData Method like,

-(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); } 

Now you using NSNotificationCenter you can get notify when device orientation chaged, so in this selector method of it call your setData method,

[[NSNotificationCenter defaultCenter] addObserver:self                                              selector:@selector(setData)                                                  name:UIDeviceOrientationDidChangeNotification                                                object:nil]; 

Now in you setData method you need remove all subviews because when device changes Orientation it will add new views to your scrollview, so remove all subview from Scrollview before setting its frame,

        [scrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; 

Make sure you are removing observer from your class like,

- (void)dealloc {     [[NSNotificationCenter defaultCenter] removeObserver:self]; } 
</div
 
 
         
         
10
 
vote
m.options.IMODE=64 での私の経験の中で、(プログラム的に使用することも)。 m.options.IMODE=65 に直接ビューを追加しないでください。

m.options.IMODE=67 のサブビューとして追加した m.options.IMODE=66 のみを1つだけする必要があります。

これが完了したら、この m.options.IMODE=68 にすべてのサブビューを追加できます。

すべて説明されていますここではここに説明されています。 Apple IOSテクニカルノートTN2154

 

In my experience with AutoLayout (that I use programmatically too). You should not add views directly to your UIScrollView.

You should do one UIView and only one, that you add as subview of your UIScrollView.

Once this is done, you can add all of your subviews to this UIView.

Everything is explained in detail here : Apple iOS Technical Note TN2154

</div
 
 
         
         
5
 
vote

問題が解決されたことを知っています。そして私はこの解決策が何人かの人々のための私の助けを願っていますので、それを投稿しています。

下記のコードは、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]))

ScrollViewを追加して、このようなサブビュー/イメージを追加した後(これは、Photos Appのようにスクロールビューのフルサイズで表示する画像の例です)

<事前> <コード> 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!])) } }
 

I know that the problem has been solved. and i hope that this solution my help for some people so i am posting it.

Below code is for adding the scrollview to the 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])) 

After added the scrollview and add the subviews/images like this(this is an example for images showing in full size of scrollview like in photos app )

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!]))              }          } 
</div
 
 
 
 
0
 
vote

Tkscrollerが中央に固定され、向きの変化を修正したい場合は、単に次のコードをinit

に入れることができます。 <事前> <コード> self.autoresizingMask = UIViewAutoresizingFlexibleWidth;

とあなたはすべてのサブビューのTkscrollerをチェックする必要があるかもしれません。自動サイズが気に入らない場合は、(3つのうちの1つ)

を設定できます。 <事前> <コード> self.autoresizingMask = UIViewAutoresizingFlexibleRightMargin; self.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin; self.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin;
 

If you want your TKScroller fixed to the center and support orientation changes, you can simply put the following code in your init

self.autoresizingMask = UIViewAutoresizingFlexibleWidth; 

and you may need to check all your subview's of TKScroller. If you don't like autosize , you can set (one of the three)

self.autoresizingMask = UIViewAutoresizingFlexibleRightMargin; self.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin; self.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin; 
</div
 
 
 
 

関連する質問

0  子供を隣人の子供に合わせますか?  ( Align child to neighbors child ) 
これらの UIView's は、2つの UILabel's を子供として持っています: 各セクションにわかるように、2 <コード> UILabel's を含む<コード> UIView があります。 左ラベルの右端が同じX位置になるように整列させてほしい。...

0  プログラムで兄弟UIViewに関連してiOS AutoLayout  ( Ios autolayout relative to the sibling uiviews programatically ) 
コンテナビュー(RedView、GreenView、YellowView)の内側に3つのカスタムビュー(RedView、GreenView、YellowView)を追加しようとしています(C1)。コンテナビュー(C1)がITサブビューのサイズと同じサイズを取得...

4  NSLAYOUTConstraintに実行時属性を設定します  ( Setting runtime attributes on nslayoutconstraint ) 
identifier プロパティをインターフェイスビルダー内からの私の制約のいくつかに設定したいと思います。 NSView Instancesでは、 User Defined Runtime Attributes の表をIBの中で使用しました。そして、...

104  UITableViewCellのIOS7での自動レイアウトの制約  ( Auto layout constraints issue on ios7 in uitableviewcell ) 
プログラムで自動レイアウトの制約を使用して、カスタムのUITableViewセルをレイアウトするために、 tableView:heightForRowAtIndexPath: のセルサイズを正しく定義しています。 iOS6でうまく機能していて、IOS7で ...

1  UIViewはスーパービューにサイズを大きくしません  ( Uiview doesnt size itself to superview ) 
私はこのような制約を持つ<コード> UIView を持っています: すべての垂直スペースと水平方向のスペースは0に設定されています。 その後 viewDidLoad は、 view を、元の UIView の subview として追加しました。これがそ...

1  iOS自動レイアウトの制約 - 3.5対4インチの画面ごとのビューサイズ変更  ( Ios auto layout constraints view resize per 3 5 vs 4 inch screen ) 
私はこれを検索してきました、そして私はそれを考え出すように見えないように見えます。 自動レイアウトの制約を使用して、電話機の画面サイズに基づいて表示サイズ変更方法を教えてください。私はiPhone 5のために完全に機能するビューを持っています、しかし私はiP...

1  AutoLayoutを追加すると、ビューは消えます  ( When i add autolayout the views disapear ) 
私は view 全体の label および1 99887665 を持っています。私は下の画像のようにそれらを手に入れようとしています: オートレイアウトを適用するためにストーリーボードを使用することはできません、私はプログラム的にそれをしなければならな...

3  特定の条件下で制約を切り替える  ( Toggling a constraint under a certain condition ) 
SETUP: constraint x、優先順位999で UIButton を設計しました。この constraint UIButton には、別の<コード> constraint y、優先順位1000もありますが、これは<コード> installed...

4  制約を追加するときにエラーが発生します  ( Getting error when adding constraint ) 
このように互いに触れるように、2 <コード> views に制約を設定しようとしています。 私はプログラムで制約を設定しようとしました: <事前> <コード> [self addConstraint:[NSLayoutConstraint constra...

35  AutoLayoutを使用したUISCrollView内のuitextview  ( Uitextview inside uiscrollview with autolayout ) 
UISCrollView内にUISCROLLView内を運転不運でアウトしようとしています。私が試したことは、 私はストーリーボードのメインビューの中にUiscrollViewを配置しました 私はストーリーボードのUiscrollView内にuItxtvi...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有