3

自動レイアウトを使用する Viewcontroller 内のラベルの位置を変更する必要があります。これを行う前に、私は使用しました

[arriveTimeLabel setTranslatesAutoresizingMaskIntoConstraints:YES];
[departTimeLabel setTranslatesAutoresizingMaskIntoConstraints:YES];

しかし、それはいくつかの実行時警告を生成します

 Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
2013-08-15 23:25:58.791 Vicinitime[78327:c07] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x9173a20 UIScrollView:0x9580190.bottom == UIView:0x9173890.bottom>",
    "<NSLayoutConstraint:0x9171fe0 V:|-(138)-[UILabel:0x958cf70]   (Names: '|':UIScrollView:0x9580190 )>",
    "<NSLayoutConstraint:0x91739a0 V:|-(0)-[UIScrollView:0x9580190]   (Names: '|':UIView:0x9173890 )>",
    "<NSAutoresizingMaskLayoutConstraint:0xab6ec90 h=--& v=&-& UILabel:0x958cf70.midY == -6.3989*UIScrollView:0x9580190.height>",
    "<NSAutoresizingMaskLayoutConstraint:0xab6eef0 h=--& v=&-& V:[UILabel:0x958cf70(25)]>",
    "<NSAutoresizingMaskLayoutConstraint:0xab6dbd0 h=--& v=--& V:[UIView:0x9173890(455)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x9171fe0 V:|-(138)-[UILabel:0x958cf70]   (Names: '|':UIScrollView:0x9580190 )>

だから私は周りを見回して、その問題を解決するには [arriveTimeLabel setTranslatesAutoresizingMaskIntoConstraints:NO]; を設定する必要があることを知りました。[departTimeLabel setTranslatesAutoresizingMaskIntoConstraints:NO];

いいえ。問題は、ラベルの位置がプログラムによって変更されないことです。

プログラムでラベルを設定するためにコーディングする必要がある場合:

    if(travelTimeInt <= activityTimeInt){

        [timeBreakdownButtonImage setBackgroundImage:[UIImage imageNamed:@"timeBreakdownBackground7.png"] forState:UIControlStateNormal];
        NSLog(@"got to setting label place");

        [self.arriveTimeLabel  setFrame:CGRectMake(67, 170, 41, 25)];

        [self.departTimeLabel  setFrame:CGRectMake(211, 170, 41, 25)];



    }
    if(travelTimeInt * 7 >= activityTimeInt){

            [timeBreakdownButtonImage setBackgroundImage:[UIImage imageNamed:@"timeBreakdownBackground6.png"] forState:UIControlStateNormal];

          NSLog(@"got to setting label place");

            self.arriveTimeLabel.frame = CGRectMake(71, 170, 41, 25);

       self.departTimeLabel.frame = CGRectMake(207, 170, 41, 25);

    }

autolayout をオンにして uilabel の位置を変更する方法はありますか? おそらく自動レイアウトを無効にしますか?

4

3 に答える 3

4

Autolayout を使用している場合は、UIViewsに基づいて配置されますNSLayoutConstraints

それらを設定するのではなく、それらを移動するにはframes、制約を変更する必要があります。

于 2013-08-16T08:53:38.550 に答える
1

Disabling autolayout for a subview can be done as mentioned here: Can I disable autolayout for a specific subview at runtime?

The other option would be to create two storyboards, one with auto-layout on, and other with auto-layout off. Then load the respective storyboard by checking the Device System Version(assuming you are targeting iOS versions earlier than 6 too). For this, add this macro to your AppDelegate:

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:(v) options:NSNumericSearch] != NSOrderedAscending)

and then:

UIStoryboard *mainStoryboard = nil;

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")) 
{
     mainStoryboard = [UIStoryboard storyboardWithName:@"AutoLayoutStoryboard" bundle:nil];
} 
else 
{
     mainStoryboard = [UIStoryboard storyboardWithName:@"NoAutoLayoutStoryboard" bundle:nil];
}

//load initial view controller
UIViewController *rootView = [mainStoryboard instantiateInitialViewController];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = rootView;
[self.window makeKeyAndVisible];
于 2013-08-16T10:55:39.447 に答える
0

自動レイアウトで開始されたプロジェクトに取り組んでいますが、コード内のいくつかのフレームを動的に調整する必要がありました。これは、自動生成された実行時間の制約によって損なわれないようにするために行ったことです (自動レイアウトのおかげです)。

1) ビューやコンポーネントを Interface Builder に配置しないでください。

2) alloc/init から始めてフレームを適切に設定するだけで、純粋にプログラムによってビューを追加します。

3) 完了。

それが役立つことを願っています!

ps。以下を使用して、ビューから制約を取り除くことを試すこともできます。

[view removeConstraints:view.constraints] しかし、私は純粋なコードのアプローチでもっと運が良かったです。

于 2014-06-19T19:13:17.757 に答える