2013-07-16 2 views
1

.xib 파일에서 UIViewController를 디자인했습니다. Autolayout을 사용합니다.레이아웃보기 금지 서브 뷰

값이 변경되면 UILabel의 텍스트를 변경하는 UISlider가 있습니다. 전송 된 이벤트 "값이 변경되었습니다"를 내 헤더 파일에 링크 한 다음 내 컨트롤러의 .m 파일에 함수를 구현합니다 . 이 메서드는 슬라이더의 값에 따라 레이블의 텍스트 만 변경합니다.

보기가 나타나면 슬라이더가 표시되지 않습니다 (화면 외부에서 설정). 애니메이션을 사용하여 뷰에 표시합니다. 내 슬라이더의 값을 변경하면 문제가 자동으로

-(void)viewDidLayoutSubviews 
{ 
} 

를 호출 그리고 불행하게도, 그것은 원래 위치로 내 컨트롤러의 뷰의 모든 서브 뷰를 재설정합니다.

슬라이더가 실제 레이아웃을 "파괴"하는 방법.

편집

인터페이스 빌더에서 내 슬라이더의 연결 : enter image description here

및 관련 기능 코드 : 여기

- (IBAction)sliderDureeValueChanged:(id)sender { 
    dureeMois = (int) sliderDuree.value; 
    if (sliderDuree.maximumValue == sliderDuree.value) 
    { 
     [lblDuree setText:@"Max"]; 
    } 
    else if (sliderDuree.minimumValue == sliderDuree.value) 
    { 
     [lblDuree setText:@"Min"]; 
    } 
    else 
    { 
     [lblDuree setText:[NSString stringWithFormat:@"%d month",dureeMois] 
    } 
} 

EDIT2

슬라이더를 사용하여 호출 할 때 [NSThread callStackSymbols]viewDidLayoutSubviews에있는 스택입니다.

2013-07-16 16:39:47.420 MyApp[2363:907] Stack trace : (
    0 MyApp        0x0003cd5f -[GraphiqueFVViewController viewDidLayoutSubviews] + 50 
    1 UIKit        0x34f938c9 <redacted> + 456 
    2 QuartzCore       0x34d3dd8b <redacted> + 214 
    3 QuartzCore       0x34d3d929 <redacted> + 460 
    4 QuartzCore       0x34d3e85d <redacted> + 16 
    5 QuartzCore       0x34d3e243 <redacted> + 238 
    6 QuartzCore       0x34d3e051 <redacted> + 316 
    7 QuartzCore       0x34d3deb1 <redacted> + 60 
    8 CoreFoundation      0x3315d6cd <redacted> + 20 
    9 CoreFoundation      0x3315b9c1 <redacted> + 276 
    10 CoreFoundation      0x3315bd17 <redacted> + 742 
    11 CoreFoundation      0x330ceebd CFRunLoopRunSpecific + 356 
    12 CoreFoundation      0x330ced49 CFRunLoopRunInMode + 104 

    13 GraphicsServices     0x36c922eb GSEventRunModal + 74 
    14 UIKit        0x34fe4301 UIApplicationMain + 1120 
    15 MyApp        0x00021add main + 116 
    16 libdyld.dylib      0x3b264b20 <redacted> + 0 

및 디버그 지역의를 역 추적

:

* thread #1: tid = 0x2503, 0x00101d46 MyApp`-[GraphiqueFVViewController viewDidLayoutSubviews](self=0x1ed972f0, _cmd=0x3541247c) + 42 at GraphiqueFVViewController.m:386, stop reason = breakpoint 2.1 
    frame #0: 0x00101d46 MyApp`-[GraphiqueFVViewController viewDidLayoutSubviews](self=0x1ed972f0, _cmd=0x3541247c) + 42 at GraphiqueFVViewController.m:386 
    frame #1: 0x34f938c8 UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 456 
    frame #2: 0x34d3dd8a QuartzCore`-[CALayer layoutSublayers] + 214 
    frame #3: 0x34d3d928 QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 460 
    frame #4: 0x34d3e85c QuartzCore`CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 16 
    frame #5: 0x34d3e242 QuartzCore`CA::Context::commit_transaction(CA::Transaction*) + 238 
    frame #6: 0x34d3e050 QuartzCore`CA::Transaction::commit() + 316 
    frame #7: 0x34d3deb0 QuartzCore`CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 60 
    frame #8: 0x3315d6cc CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 20 
    frame #9: 0x3315b9c0 CoreFoundation`__CFRunLoopDoObservers + 276 
    frame #10: 0x3315bd16 CoreFoundation`__CFRunLoopRun + 742 
    frame #11: 0x330ceebc CoreFoundation`CFRunLoopRunSpecific + 356 
    frame #12: 0x330ced48 CoreFoundation`CFRunLoopRunInMode + 104 
    frame #13: 0x36c922ea GraphicsServices`GSEventRunModal + 74 
    frame #14: 0x34fe4300 UIKit`UIApplicationMain + 1120 
    frame #15: 0x000e6a84 MyApp`main(argc=1, argv=0x2fd1bd18) + 116 at main.m:16 
    frame #16: 0x3b264b20 libdyld.dylib`start + 4 

    thread #3: tid = 0x2903, 0x3b31b648 libsystem_kernel.dylib`kevent64 + 24 
    frame #0: 0x3b31b648 libsystem_kernel.dylib`kevent64 + 24 
    frame #1: 0x3b2544f0 libdispatch.dylib`_dispatch_mgr_invoke + 796 
    frame #2: 0x3b246df8 libdispatch.dylib`_dispatch_mgr_thread$VARIANT$up + 36 

    thread #5: tid = 0x2b03, 0x3b31aeb4 libsystem_kernel.dylib`mach_msg_trap + 20 
    frame #0: 0x3b31aeb4 libsystem_kernel.dylib`mach_msg_trap + 20 
    frame #1: 0x3b31b04c libsystem_kernel.dylib`mach_msg + 40 
    frame #2: 0x3315d044 CoreFoundation`__CFRunLoopServiceMachPort + 128 
    frame #3: 0x3315bda2 CoreFoundation`__CFRunLoopRun + 882 
    frame #4: 0x330ceebc CoreFoundation`CFRunLoopRunSpecific + 356 
    frame #5: 0x330ced48 CoreFoundation`CFRunLoopRunInMode + 104 
    frame #6: 0x390cd504 WebCore`RunWebThread(void*) + 444 
    frame #7: 0x3b284310 libsystem_c.dylib`_pthread_start + 308 

    thread #7: tid = 0x241f, 0x3b31aeb4 libsystem_kernel.dylib`mach_msg_trap + 20 
    frame #0: 0x3b31aeb4 libsystem_kernel.dylib`mach_msg_trap + 20 
    frame #1: 0x3b31b04c libsystem_kernel.dylib`mach_msg + 40 
    frame #2: 0x3315d044 CoreFoundation`__CFRunLoopServiceMachPort + 128 
    frame #3: 0x3315bda2 CoreFoundation`__CFRunLoopRun + 882 
    frame #4: 0x330ceebc CoreFoundation`CFRunLoopRunSpecific + 356 
    frame #5: 0x330ced48 CoreFoundation`CFRunLoopRunInMode + 104 
    frame #6: 0x33a1b3d4 Foundation`+[NSURLConnection(Loader) _resourceLoadLoop:] + 308 
    frame #7: 0x33a9ee84 Foundation`__NSThread__main__ + 972 
    frame #8: 0x3b284310 libsystem_c.dylib`_pthread_start + 308 

    thread #8: tid = 0x2d03, 0x3b32b594 libsystem_kernel.dylib`select$DARWIN_EXTSN + 20 
    frame #0: 0x3b32b594 libsystem_kernel.dylib`select$DARWIN_EXTSN + 20 
    frame #1: 0x331611f6 CoreFoundation`__CFSocketManager + 678 
    frame #2: 0x3b284310 libsystem_c.dylib`_pthread_start + 308 

    thread #11: tid = 0x3003, 0x3b32b08c libsystem_kernel.dylib`__psynch_cvwait + 24 
    frame #0: 0x3b32b08c libsystem_kernel.dylib`__psynch_cvwait + 24 
    frame #1: 0x3b27cd2e libsystem_c.dylib`_pthread_cond_wait + 646 
    frame #2: 0x3b27caa4 libsystem_c.dylib`pthread_cond_timedwait + 44 
    frame #3: 0x37088c74 JavaScriptCore`WTF::ThreadCondition::timedWait(WTF::Mutex&, double) + 108 
    frame #4: 0x3719a556 JavaScriptCore`JSC::BlockAllocator::blockFreeingThreadMain() + 82 
    frame #5: 0x371acfaa JavaScriptCore`WTF::wtfThreadEntryPoint(void*) + 14 
    frame #6: 0x3b284310 libsystem_c.dylib`_pthread_start + 308 

    thread #12: tid = 0x3103, 0x3b31aeb4 libsystem_kernel.dylib`mach_msg_trap + 20 
    frame #0: 0x3b31aeb4 libsystem_kernel.dylib`mach_msg_trap + 20 
    frame #1: 0x3b31b04c libsystem_kernel.dylib`mach_msg + 40 
    frame #2: 0x3315d044 CoreFoundation`__CFRunLoopServiceMachPort + 128 
    frame #3: 0x3315bda2 CoreFoundation`__CFRunLoopRun + 882 
    frame #4: 0x330ceebc CoreFoundation`CFRunLoopRunSpecific + 356 
    frame #5: 0x330ced48 CoreFoundation`CFRunLoopRunInMode + 104 
    frame #6: 0x39167d06 WebCore`WebCore::runLoaderThread(void*) + 142 
    frame #7: 0x371acfaa JavaScriptCore`WTF::wtfThreadEntryPoint(void*) + 14 
    frame #8: 0x3b284310 libsystem_c.dylib`_pthread_start + 308 

    thread #15: tid = 0x3403, 0x3b32b08c libsystem_kernel.dylib`__psynch_cvwait + 24 
    frame #0: 0x3b32b08c libsystem_kernel.dylib`__psynch_cvwait + 24 
    frame #1: 0x3b27cd2e libsystem_c.dylib`_pthread_cond_wait + 646 
    frame #2: 0x3b286f18 libsystem_c.dylib`pthread_cond_wait + 40 
    frame #3: 0x37088c46 JavaScriptCore`WTF::ThreadCondition::timedWait(WTF::Mutex&, double) + 62 
    frame #4: 0x392e1e8c WebCore`WTF::PassOwnPtr<WebCore::StorageTask> WTF::MessageQueue<WebCore::StorageTask>::waitForMessageFilteredWithTimeout<bool (WebCore::StorageTask*)>(WTF::MessageQueueWaitResult&, bool (&)(WebCore::StorageTask*), double) + 56 
    frame #5: 0x392e1e40 WebCore`WebCore::StorageThread::threadEntryPoint() + 124 
    frame #6: 0x371acfaa JavaScriptCore`WTF::wtfThreadEntryPoint(void*) + 14 
    frame #7: 0x3b284310 libsystem_c.dylib`_pthread_start + 308 

    thread #17: tid = 0x3903, 0x3b32bd98 libsystem_kernel.dylib`__workq_kernreturn + 8 
    frame #0: 0x3b32bd98 libsystem_kernel.dylib`__workq_kernreturn + 8 
    frame #1: 0x3b279cfa libsystem_c.dylib`_pthread_workq_return + 18 
    frame #2: 0x3b279a16 libsystem_c.dylib`_pthread_wqthread + 366 

    thread #18: tid = 0x3b03, 0x3b32bd98 libsystem_kernel.dylib`__workq_kernreturn + 8 
    frame #0: 0x3b32bd98 libsystem_kernel.dylib`__workq_kernreturn + 8 
    frame #1: 0x3b279cfa libsystem_c.dylib`_pthread_workq_return + 18 
    frame #2: 0x3b279a16 libsystem_c.dylib`_pthread_wqthread + 366 

    thread #19: tid = 0x3707, 0x3b32bd98 libsystem_kernel.dylib`__workq_kernreturn + 8 
    frame #0: 0x3b32bd98 libsystem_kernel.dylib`__workq_kernreturn + 8 
    frame #1: 0x3b279cfa libsystem_c.dylib`_pthread_workq_return + 18 
    frame #2: 0x3b279a16 libsystem_c.dylib`_pthread_wqthread + 366 
+0

컨트롤러 하위 뷰에서 원래 위치를 유지하거나 슬라이더에 컨트롤러 하위 뷰 레이아웃을 "파괴"하도록 하시겠습니까? –

+0

음 ... 내 슬라이더는 "매개 변수"입니다. 화면에서보기가 나타나면 버튼을 눌러 표시합니다.이 버튼과 슬라이더는 UIView 클래스의'animateWithDuration : animations :^{}'메소드를 사용하여 애니메이션됩니다. 슬라이더의 값을 변경할 때 슬라이더와 버튼 모두를 그대로두기를 원합니다 (수정할 때 슬라이더가 사라지도록하지 않는 것입니까?) – zbMax

+0

이것은 UISlider입니까? 슬라이더가 수정 될 때 호출되는 코드를 표시 할 수 있습니까? –

답변

2

헤이 슈퍼 여기에 파티에 늦었지만 우리가 상대적으로 같은 문제를했고 나는 그것에 조금을 밝혀 싶었다.

메인보기에는 라벨, 로그인 필드가 포함 된보기 및 Facebook 버튼이 포함 된보기가 있습니다. 버튼을 눌렀을 때 2 개의 로그인보기가 토글되며 오류가 발생하면 레이블은 0으로 확장되고 텍스트가 전환 된 다음 1로 다시 스케일됩니다. 레이블이 애니메이션되고 크기가 변경되면 제약 조건이 다시 적용되고 첫 번째보기가 원래 위치로 다시 전환됩니다.

"didLayoutSubviews"에 대한 설명서에서 해당보기가 경계를 변경할 때보기의 부모에서 호출되는 것으로 나타났습니다. 뷰의 변환을 수정할 때 경계를 변경하는 것으로 간주한다고 가정합니다.

그래서보기가 움직이면 모든 형제보기가 원래 상태로 다시 위치하게됩니다.

레이블을 자신의보기에 넣음으로써이 문제를 해결했습니다. 애니메이션을 만들면 부모의 "layoutSubviews"를 호출합니다.이 레이아웃은 자체적으로 레이아웃되어 있습니다.

+0

Thx를 트리거해야합니다. 내가 게시 한 이래로 내 문제를 해결했습니다. 문제는 제약 조건 때문에 뷰가 움직이게되고, 슈퍼 뷰에 영향을주는 이벤트 (뷰 뷰 컨트롤러 추가, 자동 뷰 ... 등)가 제약 조건을 재설정했기 때문입니다. 해결책은 제약 조건에 대한 참조를 추가하고, 값을 변경하고, 수퍼 뷰에 하위 뷰를 배치하고 제약 조건을 업데이트하도록 요청하는 것이 었습니다. – zbMax

+0

이것은 많은 도움을주었습니다! 제스처와 레이아웃으로 뷰를 드래그 할 때마다 거대한 메모리 문제가 발생했습니다. 서브 뷰는 지속적으로 호출되어 다른 뷰로 들어가서 메모리 문제를 해결했습니다. –